考虑以下用于重载operator<<for a的示例代码class A

#include <iostream>
class A {
    template <typename T>
    friend A &operator<<(A &a, const,c++,g++,operator-overloading,specifications"/>
	














首页 > 解决方案 > 如何显式调用运算符 < 的模板化重载

考虑以下用于重载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");
                                                      ^

然而,我不明白为什么这不应该编译。

这是godbolt中的代码。


我找不到引用“父母”的正确方法

在我的 Access 主窗体上,我有一个列表框控件(名为“ActionsTaken”),它显示了与主窗体记录相关联的操作列表。这些都保存在链接到主表的单独表中。通过一个按钮,我打开一个子表单以将项目添加到列表中。输入文本后,我按下“完成”按钮,该按钮使用宏关闭子表单。当子窗体关闭时,停用事件会触发一个事件过程来验证数据,将其写入操作表,并(希望)重新查询主窗体上的列表控件。如果我使用对主窗体上控件的显式引用进行重新查询,一切正常,但是这个子窗体是从几个不同的主窗体调用的,所以我想使用“父窗体”来引用主窗体上的控件。我认为应该起作用的语法是:

Me.Parent!ActionsTaken.Requery

当代码执行时,我在上面的行中得到一个调试中断,当我重置代码执行时,我得到一个弹出框,其中“当前记录中没有名为'Me.Parent!ActionsTaken'的字段”。控件肯定存在(请记住,对它的显式引用有效)。

我怀疑我不明白应该如何引用“父母”。我发现许多其他语法都有点和爆炸的各种组合,并且没有“我”。有些给我不同的错误信息,但没有一个工作。

我发现了一些尴尬的解决方法,但我真的很好奇出了什么问题。

标签: c++g++operator-overloadingspecifications

解决方案


类内友元函数暴露于任何范围。朋友注入曾经是一件事(在发明 ADL 之前),但现在除了使用 ADL 之外没有其他方法可以调用它们,除非您事先声明它们。在这种情况下,一种解决方法是事先在类之外声明模板函数。

class A;

template <typename T>
A &operator<<(A &a, const T &t);

推荐阅读