【问题标题】:Overloaded << Operator in C++ not found未找到 C++ 中重载的 << 运算符
【发布时间】:2012-06-15 08:28:31
【问题描述】:

这是困扰我的问题:我在头文件 FAPPDebug.h 中有一个重载的operator &lt;&lt;,例如:

QTextStream& operator << (QTextStream& a, FAPPDebug& b);

以及FAPPDebug.cpp中的实现:

QTextStream& operator << (QTextStream& a, FAPPDebug& b)
{
    QString msg = *b.stream->ts.string(); // just take the message from b
    a << msg;
    return a;
}

以及对应的函数调用:

QTextStream(stdout) << (debug() << "Quitting because application object is not set.");

不管这看起来多么奇怪,它都可以在带有 MSVC2010 的 Windows 下编译(并且可以工作!)

debug() 只是一个从当前位置创建 FAPPDebug 对象的宏。请注意 (debug()

在使用 g++ 4.4 的 Linux 下,我收到以下错误:

MessageBroker.cpp:91: 错误:'operatorPRETTY_FUNCTION)), (LogLevel)7u).FAPPDebug::operatorFAPPDebug::operatorFAPPDebug::operator

(候选人很多,我只保留重要的)

我已将函数调用修改为:

::operator << (QTextStream(stdout),  debug() << "Failed to schedule application startup.");

我收到错误消息:

MessageBroker.cpp:在成员函数'bool MessageBroker::init(Application*, const QString&)': MessageBroker.cpp:91:错误:没有匹配的调用函数 ‘操作员 QTextStream& 运算符

所以你可以看到每次都能找到正确的函数(是的,FAPPDebug.h 头文件包含在 MessageBroker.cpp 中),但“更符合标准”的编译器未能使用它。我觉得这是我对某处标准的理解中的一个小故障,所以我请求您帮助找到它。

编辑:运算符在class FAPPDebug中被声明为朋友

EDIT2:debug() 是一个宏,定义如下:

#define debug() FAPPDebug(__LINE__, __FILE__, __PRETTY_FUNCTION__, LOG_DEBUG)

即。它只是创建了一个 FAPPDebug 对象,其参数指示当前位置。

谢谢! f.

【问题讨论】:

    标签: c++ operator-overloading stream-operators


    【解决方案1】:

    我认为问题可能是您的插入运算符按预期接受引用(左值)作为第一个参数,但您试图传递从构造函数自动创建的右值。想一想,您如何期望自动创建的 QTextStream(stdout) 能够执行一系列 QTextStream(stdout) pin你的右值。 或者你可以只声明一个像 QTextStream qout(stdout) 这样的变量,然后使用 qout 来代替。

    【讨论】:

      【解决方案2】:

      operator&lt;&lt; 的第二个参数不应该是FAPPDebug const& 吗?您不能使用临时初始化非常量引用, 即使某些编译器仍然无法检测到错误。

      【讨论】:

      • 没有仍然无法正常工作,在这种情况下它找到了FAPPDebug.h:94: note: QTextStream&amp; operator&lt;&lt;(QTextStream&amp;, const FAPPDebug&amp;) 函数但仍然无法建立连接
      • debug()的类型是什么?除非它是对 QTextStream 的非常量引用,否则无法调用您的函数。使用const,右手操作数可以是临时的(包括隐式转换的结果)。
      【解决方案3】:

      如果你仔细看,编译器看到的函数和你定义的函数是不一样的。

      它看到了什么:

      no matching function for call to ‘operator<<(QTextStream, ...
      

      它定义了什么

      QTextStream& operator<<(QTextStream&, ...
      

      似乎无法将临时对象作为非常量引用传递。 所以要么将其更改为QTextStream const&amp;,要么使用右值引用

      编辑:哦,好吧,我刚刚明白作为第一个参数传递的流不能真正是 const。在我看来,如果可能的话,使用右值引用或仅按值捕获似乎是现在唯一的方法。是您的 (debug() ...) 对象导致了问题。

      【讨论】:

        【解决方案4】:

        我遇到了这个问题,这是任何 C++ 初学者都会遇到的问题。

        QTextStream& operator << (QTextStream& a, FAPPDebug& b);
        

        这是你的声明,但你的用法是:

        QTextStream(stdout) << (debug() << "Quitting because application object is not set.");
        

        我假设你的 FAPPDEbug 对象有一个运算符,可以让它在 const char 指针上使用运算符。那么这就变成了这个

        QTextStream(stdout) << FAPPDebugObject; 
        

        如果 FAPPDebugObject 没有作为引用返回,你的编译器不会找到它,因为你在下一个运算符中要求引用 arg。

        我希望它对您或任何寻求解决方案的人有意义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          相关资源
          最近更新 更多