重载<<找不到C ++中的运算符

时间:2012-06-15 08:28:32

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

这让我很烦恼:我在头文件FAPPDebug.h中有一个重载operator <<,例如:

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.");

不管这看起来多么奇怪,这在Windows下用MSVC2010进行编译(并且有效!)

debug()只是一个从当前位置创建FAPPDebug对象的宏。请注意(debug()&lt;&lt;“...”)附加的()的额外集合,但不会产生我想要的东西。

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

  

MessageBroker.cpp:91:错误:不匹配'operator&lt;&lt;'in   “QTextStream(标准输出,   QFlags((QIODevice :: OpenModeFlag)3u))&lt;&lt;   ((FAPPDebug *)((FAPPDebug *)FAPPDebug(417,(const)   char *)“MessageBroker.cpp”),((const char *)(&amp; PRETTY_FUNCTION )),   (LogLevel的)7U).FAPPDebug ::运营商LT;≤(((常量   char *)“Module”))) - &gt; FAPPDebug :: operator&lt;&lt;(((const QString&amp;)((const   QString的*)(&安培;   ModuleBase :: getModuleDescription()()))))) - &GT; FAPPDebug ::运营商LT;≤(((常量   char *)“因为没有设置应用程序对象而退出。”))'   /usr/local/Trolltech/Qt-4.8.2/include/QtCore/qtextstream.h:184:注意:   候选人是:FAPPDebug.h:94:注意:QTextStream&amp;   运算符&lt;&lt;(QTextStream&amp;,FAPPDebug&amp;)

(有很多候选人,我刚刚保留了重要的内容)

我已将函数调用修改为:

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

我收到错误消息:

  

MessageBroker.cpp:在成员函数'bool中   MessageBroker :: init(Application *,const QString&amp;)':   MessageBroker.cpp:91:错误:没有用于调用的匹配函数   'operator&lt;&lt;(QTextStream,FAPPDebug&amp;)'   /usr/local/Trolltech/Qt-4.8.2/include/QtCore/qchar.h:396:注意:   候选人是:QDataStream&amp;运算符&lt;&lt;(QDataStream&amp;,const QChar&amp;)   /home/ferenc/work/trunk/Core/Common/FAPPDebug.h:94:注意:
  QTextStream&安培;运算符&lt;&lt;(QTextStream&amp;,FAPPDebug&amp;)

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

编辑:运营商在class FAPPDebug

中被宣布为朋友

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

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

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

谢谢! F。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

它看到了什么:

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

它定义了什么

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

似乎临时对象不能作为非const引用传递。 因此,要么将其更改为QTextStream const&,要么使用右值参考

编辑:哦,我只是理解作为第一个参数传递的流不能真正是const。使用右值引用或只是按值捕获,如果可能的话,在我看来是现在唯一的方法。这是造成问题的(debug() ...)对象。

答案 2 :(得分:1)

我认为问题可能是你的插入运算符接受了一个引用(左值)作为第一个参数,正如预期的那样,但是你试图传递一个从构造函数自动创建的右值。想想看,你如何期望自动创建的QTextStream(stdout)能够生成一系列类型的调用,QTextStream(stdout)&lt;&lt; a&lt;&lt; b&lt;&lt; C。实际上,这是x&lt;&lt;那么x&lt;&lt; b然后x&lt;&lt; C。为了让它在单个句子中发生,我认为第一个和返回都必须是const引用,它能够 pin 你的rvalue。 或者你可以只声明一个像QTextStream qout(stdout)这样的变量,然后使用qout。

答案 3 :(得分:0)

我遇到了这个问题,这是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。

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