c++ - 如何显式调用运算符 < 的模板化重载
考虑以下用于重载operator<<
for a的示例代码class A
:
#include <iostream>
class A {
template <typename T>
friend A &operator<<(A &a, const
问题描述
考虑以下用于重载operator<<
for a的示例代码class A
:
#include <iostream>
class A {
template <typename T>
friend A &operator<<(A &a, const T &t)
{
std::cout << t << std::endl;
return a;
}
friend A &operator<<(A &a, const std::string &t)
{
return operator<<<std::string>(a, t + "x");
}
};
我的意图是第二个运算符显式调用第一个运算符。
但是,在 g++ 7.4 中,这失败了
在函数'A& operator<<(A&, const string&)'中:
错误:'operator<<'未定义
return operator<<<std::string>(a, t + "x");
^~
错误:'>' 标记之前的预期主表达式
返回运算符<<<std::string>(a, t + "x");
^
然而,我不明白为什么这不应该编译。
我找不到引用“父母”的正确方法
在我的 Access 主窗体上,我有一个列表框控件(名为“ActionsTaken”),它显示了与主窗体记录相关联的操作列表。这些都保存在链接到主表的单独表中。通过一个按钮,我打开一个子表单以将项目添加到列表中。输入文本后,我按下“完成”按钮,该按钮使用宏关闭子表单。当子窗体关闭时,停用事件会触发一个事件过程来验证数据,将其写入操作表,并(希望)重新查询主窗体上的列表控件。如果我使用对主窗体上控件的显式引用进行重新查询,一切正常,但是这个子窗体是从几个不同的主窗体调用的,所以我想使用“父窗体”来引用主窗体上的控件。我认为应该起作用的语法是:
Me.Parent!ActionsTaken.Requery
当代码执行时,我在上面的行中得到一个调试中断,当我重置代码执行时,我得到一个弹出框,其中“当前记录中没有名为'Me.Parent!ActionsTaken'的字段”。控件肯定存在(请记住,对它的显式引用有效)。
我怀疑我不明白应该如何引用“父母”。我发现许多其他语法都有点和爆炸的各种组合,并且没有“我”。有些给我不同的错误信息,但没有一个工作。
我发现了一些尴尬的解决方法,但我真的很好奇出了什么问题。
解决方案
类内友元函数不暴露于任何范围。朋友注入曾经是一件事(在发明 ADL 之前),但现在除了使用 ADL 之外没有其他方法可以调用它们,除非您事先声明它们。在这种情况下,一种解决方法是事先在类之外声明模板函数。
class A;
template <typename T>
A &operator<<(A &a, const T &t);
推荐阅读
- php - Symfony 5 缓存组件 AWS elasticache 无效 DSN
- php - Yii2 - 下载损坏的文件
- delphi - Indy TIdHashMessageDigest5 HashStringAsHex 编译时错误:未声明的标识符:'HashStringAsHex'
- java - 为什么握手后我的套接字关闭了,我该如何解决这个问题?
- c# - 如何对将在多个步骤中创建的聚合进行建模,例如向导样式
- azure - 将 Azure 数字孪生与现有云环境连接
- verilog - 使用带负数的系统函数 $urandom_range(minval, maxval) 时的未定义行为
- r - 使用 R 处理多个光栅文件时保留原始文件名
- flutter - 关于防止 Listview.Builder() 重建所有项目
- sas - 寻找季节性效应的自变量?
考虑以下用于重载operator<<
for a的示例代码class A
:
#include <iostream>
class A {
template <typename T>
friend A &operator<<(A &a, const
问题描述
考虑以下用于重载operator<<
for a的示例代码class A
:
#include <iostream>
class A {
template <typename T>
friend A &operator<<(A &a, const T &t)
{
std::cout << t << std::endl;
return a;
}
friend A &operator<<(A &a, const std::string &t)
{
return operator<<<std::string>(a, t + "x");
}
};
我的意图是第二个运算符显式调用第一个运算符。
但是,在 g++ 7.4 中,这失败了
在函数'A& operator<<(A&, const string&)'中:
错误:'operator<<'未定义
return operator<<<std::string>(a, t + "x");
^~
错误:'>' 标记之前的预期主表达式
返回运算符<<<std::string>(a, t + "x");
^
然而,我不明白为什么这不应该编译。
在我的 Access 主窗体上,我有一个列表框控件(名为“ActionsTaken”),它显示了与主窗体记录相关联的操作列表。这些都保存在链接到主表的单独表中。通过一个按钮,我打开一个子表单以将项目添加到列表中。输入文本后,我按下“完成”按钮,该按钮使用宏关闭子表单。当子窗体关闭时,停用事件会触发一个事件过程来验证数据,将其写入操作表,并(希望)重新查询主窗体上的列表控件。如果我使用对主窗体上控件的显式引用进行重新查询,一切正常,但是这个子窗体是从几个不同的主窗体调用的,所以我想使用“父窗体”来引用主窗体上的控件。我认为应该起作用的语法是:
Me.Parent!ActionsTaken.Requery
当代码执行时,我在上面的行中得到一个调试中断,当我重置代码执行时,我得到一个弹出框,其中“当前记录中没有名为'Me.Parent!ActionsTaken'的字段”。控件肯定存在(请记住,对它的显式引用有效)。
我怀疑我不明白应该如何引用“父母”。我发现许多其他语法都有点和爆炸的各种组合,并且没有“我”。有些给我不同的错误信息,但没有一个工作。
我发现了一些尴尬的解决方法,但我真的很好奇出了什么问题。
类内友元函数不暴露于任何范围。朋友注入曾经是一件事(在发明 ADL 之前),但现在除了使用 ADL 之外没有其他方法可以调用它们,除非您事先声明它们。在这种情况下,一种解决方法是事先在类之外声明模板函数。
class A;
template <typename T>
A &operator<<(A &a, const T &t);