2011-09-13 27 views
3

私はしばらく解決しようとしていたが、完全に困惑しているという問題がある。だから、XとYの2つのクラスがあり、それぞれに独自のヘッダファイルX.hとY.hがあります。それぞれはQ_OBJECTであり、ヘッダファイルにそのマクロ定義があります。Qt - C2504を引き起こすmoc:基底クラスが未定義

class Y: public X { Q_OBJECT ...} 

Yの定義が読み取ります。 Xの定義は、読み取ります。私はコンパイルすると、

class X: public QGLWidget {Q_OBJECT ...} 

X.cppとY.cppは正しくコンパイルし、その段階での問題はありません。 mocファイルも問題なく生成されます。

しかし、標準QTビルドプロセスがmoc_X.cppをコンパイルすると、 "C:\ path \ Y.h(34):エラーC2504: 'X':基本クラスが定義されていません。しかし、これはY.cppやX.cppをコンパイルしているときには起こりません。これは、mocファイルをコンパイルするときにのみ起こります!何か案は?モックの段階でビルドが失敗し、モカの段階だけが非常に独特のように思える。助けが大いにありがとう!

+1

何らかの変更によって、クラスXを宣言し、ヘッダーを含めなかったか? – blueskin

答えて

6

私はこれを説明した形で再生しようとしましたが、できませんでした。警備員を含めるに

エラー:

ので、チェックする価値があるだろう事はここにありますか?あなたが誤って2つの異なるヘッダ(すなわち#ifndef X_H#define X_Hライン)

に同じ名前の2インクルードガードを持っていないことを

は、Check(これはあなたの説明から、おそらく可能性が低い:それは希望もしエラーがmoc_Y.cppのコンパイルに含まれていた可能性が高いでしょう)

シグナルまたはスロットで使用される型の前方宣言?

シグナルまたはスロットのパラメータでは、余分なヘッダーを含める必要があることがあります。

私が説明できる最良の方法は、あなたのヘッダーがクラスへの前方宣言でうまくいく場合がありますが、mocはコードを生成して、ヘッダーのみ前方宣言します。

この場合、.uiにコードを追加する方法があります。これは、前方宣言型の余分なヘッダーを含めることを要求します。しかし、最も簡単な解決策は、前方宣言をX.hまたはY.hの代わりに適切なヘッダに置き換えることです。

は、上記の問題が解決しない、とあなたはまだ行っていない場合、私は開放問題MOCファイルを示唆して読みたい場合はmoc_X.cppの内容は

ファイルチェックコード。それが何をしているかを見たら、あなたにいくつかのアイデアを与えるかもしれません。

+0

mocファイルを読むと、2番目のポイント「信号やスロットで使用される型の前方宣言」が問題になっているようです。とにかく、私のプロジェクトの#includeはひどく構造化されていましたが、私がそれらをすべて再構築すると、コンパイルされました。ありがとう! – Gravity

関連する問題