2

プロジェクトのコンパイル中に、この非常に奇妙な問題が発生しました。MOCは、ファイル/クラスのどこにも言及されていませんが、モックされるクラス名に名前空間を追加しているようです。

ただし、名前空間は私が使用するライブラリに存在しますが、ヘッダーファイルでは遠くに隠されており、UIファイルでは使用しません。これはMOCが生成するものです:

const QMetaObject SmpTl::CaptureController::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_SmpTl__CaptureController,
  qt_meta_data_SmpTl__CaptureController, 0 }};

名前SmpTl空間は、の宣言のどこにも記載されていませんCaptureControllerが、MOCで生成された.cppファイルに表示されます。

QT統合でVisualStudioを使用しています。

4

2 に答える 2

2

私もこの問題に遭遇しました。次のようなコードがありました。

namespace foo {
    #ifdef _WIN32
    ...   // This code was fine
    #else
    #error Not Supported
    #endif
}

これにより、MOC は名前空間fooが決して閉じられないと考えるようになりました。どうやら、 が定義されていることを知らず_WIN32、エラー メッセージを引用符で囲み忘れたという事実につまずいたようです。次のように変更します。

#error "Not Supported"

私の問題を修正しました。

于 2012-03-07T20:58:44.280 に答える
0

SmpTlCaptureControllerMOC によって検出されたように、定義されている名前空間です。

Q_OBJECTマクロは、クラス定義内の -variable の宣言に展開されますstaticMetaObject(特に展開先)。MOC ファイルには、その変数の定義が含まれています。

これが正しくない場合は、Qt のバージョンとヘッダー ファイルの削除されたバージョンを投稿してください。

于 2010-04-21T19:56:57.917 に答える