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

これがどれほど奇妙に見えても、これは 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.

4

4 に答える 4

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 に答える
1

あなたの2番目のパラメータはすべきではありませんoperator<<FAPPDebug const&?一部のコンパイラがまだエラーを検出できない場合でも、非 const 参照を一時的に初期化することはできません。

于 2012-06-15T08:39:58.353 に答える
1

よく見ると、コンパイラが使用する関数と定義した関数は同じではありません。

それが見るもの:

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

定義した内容

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

非 const 参照として一時オブジェクトを渡すことができなかったようです。したがって、右辺値参照QTextStream const&に変更するか、使用してください。

編集:まあ、最初のパラメーターとして渡されるストリームが実際には const にならないことを理解しました。可能であれば、右辺値参照を使用するか、単に値でキャッチすることが、今それを行う唯一の方法のようです。(debug() ...)問題を引き起こしているのはあなたのオブジェクトです。

于 2012-06-15T08:41:05.233 に答える