'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;
};

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

創作者介紹
創作者 BB 的頭像
BB

Welkin小窩

BB 發表在 痞客邦 留言(0) 人氣()