1

这是困扰我的问题:我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。

4

4 回答 4

1

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

于 2012-06-15T08:39:58.353 回答
1

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

它看到了什么:

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

它定义了什么

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

似乎临时对象不能作为非常量引用传递。因此,要么将其更改为QTextStream const&或使用rvalue reference

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

于 2012-06-15T08:41:05.233 回答
1

我认为问题可能是您的插入运算符按预期接受引用(左值)作为第一个参数,但是您试图传递从构造函数自动创建的右值。想一想,您如何期望一个自动创建的 QTextStream(stdout) 进行一系列类型的调用,QTextStream(stdout) << a << b << c。实际上,这是 x << a 然后 x << b 然后 x << c。为了让它在一个句子中发生,我认为第一个和返回都必须是 const 引用,它能够固定你的右值。或者您可以只声明一个变量,如 QTextStream qout(stdout),并使用 qout 代替。

于 2012-06-15T14:13:58.570 回答
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。

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

于 2020-07-05T12:23:18.570 回答