'XX' does not name a type 和 field 'XX' has incomplete type - 兩個 C++ 編譯錯誤及解決辦法
編譯錯誤一:
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"
報錯的位置為 A a; 那一行。
即使 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;
};
這樣,這段簡單的代碼才能沒有錯誤的通過編譯。
留言列表