这是困扰我的问题:我operator <<
在头文件 FAPPDebug.h 中有一个重载,例如:
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() << "...") 周围的额外 () 集,但它不会产生我想要的。
在使用 g++ 4.4 的 Linux 下,我收到以下错误:
MessageBroker.cpp:91: 错误: 'QTextStream(stdout, QFlags((QIODevice::OpenModeFlag)3u)) << ((FAPPDebug*)((FAPPDebug*)FAPPDebug(417, ( (const char*)"MessageBroker.cpp"), ((const char*)(& PRETTY_FUNCTION )), (LogLevel)7u).FAPPDebug::operator<<(((const char*)"Module")))- >FAPPDebug::operator<<(((const QString&)((const QString*)(& ModuleBase::getModuleDescription()())))))->FAPPDebug::operator<<(((const char*)"由于未设置应用程序对象而退出。"))' /usr/local/Trolltech/Qt-4.8.2/include/QtCore/qtextstream.h:184:注意:候选人是:FAPPDebug.h:94:注意:QTextStream& 运算符<<(QTextStream&, FAPPDebug&)
(候选人很多,我只保留重要的)
我已将函数调用修改为:
::operator << (QTextStream(stdout), debug() << "Failed to schedule application startup.");
我收到错误消息:
MessageBroker.cpp:在成员函数'bool MessageBroker::init(Application*, const QString&)'中:MessageBroker.cpp:91: 错误:没有匹配函数调用'operator<<(QTextStream, FAPPDebug&)' /usr/local /Trolltech/Qt-4.8.2/include/QtCore/qchar.h:396:注意:候选人是:QDataStream& operator<<(QDataStream&, const QChar&) /home/ferenc/work/trunk/Core/Common/FAPPDebug.h :94: 注意:
QTextStream& 运算符<<(QTextStream&, FAPPDebug&)
所以你可以看到每次都能找到正确的函数(是的,FAPPDebug.h 头文件包含在 MessageBroker.cpp 中),但“更符合标准”的编译器未能使用它。我觉得这是我对某处标准的理解中的一个小故障,所以我请求您帮助找到它。
编辑:操作员被声明为朋友class FAPPDebug
EDIT2: debug() 是一个宏,定义如下:
#define debug() FAPPDebug(__LINE__, __FILE__, __PRETTY_FUNCTION__, LOG_DEBUG)
IE。它只是创建了一个 FAPPDebug 对象,其参数指示当前位置。
谢谢!F。