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

LebronRan發表於2014-11-23
</pre><pre name="code" class="html"><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">兩個C++編譯錯誤及解決辦法--does not name a type和field `XX' has incomplete type</p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"> </p><table border="0" style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><tbody><tr><td><p>
</p><p>編譯錯誤一:XX does not name a type</p><p>編譯錯誤二:field `XX' has incomplete type</p><p>編譯錯誤一:XX does not name a type</p><p>例子如下(在別處看到的):</p><p>class B{</p><p>public:</p><p>B(){}</p><p>~B(){}</p><p>private:</p><p>A a;</p><p>};</p><p>class A{</p><p>public:</p><p>A(){}</p><p>~A(){}</p><p>private:</p><p>int a;</p><p>};</p><p>編譯成則將報一個error:"A does not name a type"</p><p>報錯的位置為紅色那一行。</p><p>即使clase A和class B分別在兩個檔案定義,並且在定義B的檔案頭中#include了class A的標頭檔案也同樣會報這個錯(這是因為編譯和連結之間的先後關係造成的)。</p><p>解決該錯誤的辦法:</p><p>在class B定義宣告之前先宣告一下class A, 如下:</p><p>class A;</p><p>class B{</p><p>public:</p><p>B(){}</p><p>~B(){}</p><p>private:</p><p>A a;</p><p>};</p><p>class A{</p><p>public:</p><p>A(){}</p><p>~A(){}</p><p>private:</p><p>int a;</p><p>};</p><p>編譯錯誤二:field `XX' has incomplete type</p><p>同樣緊跟上面的例子,通過問題一的辦法,第一個錯誤已經消失,但是馬上第二個錯誤就出現了!還是同一個位置。</p><p>這個錯誤的意思,就是說class B中的XX域的型別不夠完整,為什麼呢?明明class A後面已經定義好了啊。其實原因還是和前面一樣,在class B定義之前,我們也只是對class A進行了宣告而並沒有進行具體的定義,所以解決該錯誤的方法是:</p><p>將class B定義中的A域改用指標就行了。改正後程式碼為:</p><p>class A;</p><p>class B{</p><p>public:</p><p>B(){}</p><p>~B(){}</p><p>private:</p><p>A *a;</p><p>};</p><p>class A{</p><p>public:</p><p>A(){}</p><p>~A(){}</p><p>private:</p><p>int a;</p><p>};</p><p>這樣,這段簡單的程式碼才能沒有錯誤的通過編譯。</p></td></tr></tbody></table>


相關文章