これが私を悩ませているものです: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.");
これがどれほど奇妙に見えても、これは MSVC2010 を使用する Windows でコンパイル (および動作) します。
debug() は、現在の場所から FAPPDebug オブジェクトを作成する単なるマクロです。(debug() << "...") の周りの () の余分なセットに注意してください。それがなければ、私が望むものを生成していません。
一方、g++ 4.4 を使用する Linux では、次のエラーが発生します。
MessageBroker.cpp:91: エラー: 'QTextStream(stdout, QFlags((QIODevice::OpenModeFlag)3u)) の 'operator<<' に一致しません << ((FAPPDebug*)((FAPPDebug*)FAPPDebug(417, () (const char*)"MessageBroker.cpp"), ((const char*)(& PRETTY_FUNCTION )), (LogLevel)7u).FAPPDebug::operator<<(((const char*)"モジュール")))- >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& operator<<(QTextStream&, FAPPDebug&)
ご覧のとおり、正しい関数が毎回見つかります (はい、FAPPDebug.h ヘッダーは MessageBroker.cpp に含まれています) が、「より標準に準拠した」コンパイラはそれを使用できませんでした。これはどこかで標準の理解に誤りがあると感じているので、それを見つけるためにあなたの助けを求めています.
EDIT:演算子は友人として宣言されていますclass FAPPDebug
EDIT2: debug() はマクロであり、次のように定義されます。
#define debug() FAPPDebug(__LINE__, __FILE__, __PRETTY_FUNCTION__, LOG_DEBUG)
すなわち。現在の位置を示すパラメーターを持つ FAPPDebug オブジェクトを作成しただけです。
ありがとう!f.