这让我很烦恼:我在头文件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。
答案 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。
我希望这对您或任何寻求解决方案的人都有意义。