編譯錯誤 --- does not name a type和field `XX' has incomplete type

guogaofeng1219發表於2010-08-13

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

 

 

編譯錯誤一: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;

};

編譯錯誤二: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;

};

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

相關文章