2011-09-13 36 views
3

我遇到一個問題,我一直試圖解決,但我完全難住了。所以我有兩個類,X和Y,它們都有它們自己的頭文件,X.h和Y.h.每個都是Q_OBJECT,並在頭文件中有該宏定義。Qt -moc導致C2504:基類undefined

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):error C2504:'X':base class undefined」。但是這在編譯Y.cpp或X.cpp時不會發生,它只發生在編譯moc文件時!有任何想法嗎?在moc階段這個構建將會失敗,只有moc階段看起來非常奇特。非常感謝幫助!

+1

通過任何更改你轉發宣告類X並沒有包括頭? – blueskin

回答

6

我試過複製它,用你給的描述,並沒有能夠。

因此,這裏有事情,這將是值得一試:在包括警衛

錯誤?

檢查你有沒有意外地得到了2包括得分後衛同名的2個不同的標題(即#ifndef X_H#define X_H線)

(這也許是不太可能,從你的描述:它會如果錯誤在編譯moc_Y.cpp時更可能)

信號或插槽中使用的類型的前向聲明?

有時信號或插槽中的參數可能需要包含額外的標頭。

我可以解釋它的最好方法是說,有些情況下,您的標題可能會對類進行前向聲明,但moc可以生成需要實際創建或銷燬類型的代碼頭只有前向聲明。

如果是這種情況,有一種方法可以向.ui添加代碼,該代碼請求爲前向聲明類型包含額外的頭文件。但最簡單的解決方案就是用適當的頭代替X.h或Y.h中的前向聲明。

檢查moc_X.cpp文件的內容

如果上面沒有幫助,如果你還沒有這樣做的話,我建議開放問題的MOC文件和讀取碼。一旦你看到它在做什麼,它可能會給你一些想法。

+0

當我讀取moc文件時,您的第二點「確定信號或插槽中使用的類型的前向聲明」可能成爲問題。無論如何,我的項目中的#包括糟糕的結構,當我重組它們時,編譯的東西。謝謝! – Gravity