兩個C++編譯錯誤及解決辦法--does not name a type和field `XX' has incomplete type

wanglei2258發表於2009-09-10

編譯錯誤一: XX does not name a type
編譯錯誤二: field `XX' has incomplete type

編譯錯誤一:
XX does not name a type, 中文意思為“XX沒有命名一個型別“
拿個例子來講,如果兩個類定義如下:
class B{
public:
B(){}
~B(){}

private:
A a;
};

class A{
public:
A(){}
~A(){}

private:
int a;
};

編譯成則將報一個error:"A does not name a type"
報錯的位置為紅色那一行。

即使clase A和class B分別在兩個檔案定義,並且在定義B的檔案頭中#include了class A的標頭檔案也同樣會報這個錯(這是因為編譯和連結之間的先後關係造成的)。

解決該錯誤的辦法:
在class B定義宣告之前先宣告一下class A , 如下:
class A;
class B{
public:
B(){}
~B(){}

private:
A a;
};

class A{
public:
A(){}
~A(){}

private:
int a;
};

參照: http://www.allegro.cc/forums/thread/586909

編譯錯誤二: field `XX' has incomplete type
同樣緊跟上面的例子,通過問題一的辦法,第一個錯誤已經消失,但是馬上第二個錯誤就出現了!還是同一個位置。
這個錯誤的意思,就是說class B中的XX域的型別不夠完整,為什麼呢?明明class A後面已經定義好了啊。其實原因還是和前面一樣,在class B定義之前,我們也只是對class A進行了宣告而並沒有進行具體的定義,所以解決該錯誤的方法 是:
將class B定義中的A域改用指標就行了 。改正後程式碼為:
class A;
class B{
public:
B(){}
~B(){}

private:
A *a;
};

class A{
public:
A(){}
~A(){}

private:
int a;
};

這樣,這段簡單的程式碼才能沒有錯誤的通過編譯。

相關文章