簡體   English   中英

錯誤:'...'沒有命名類型

[英]Error: '…' does not name a type

我有一個工作項目。 重新安排一些代碼之后,我嘗試重新編譯我的項目,然后開始發生奇怪的事情。 看看編譯器輸出中的這段摘錄。 我正在使用MinGW G ++在Windows上編譯Eclipse。

**** Build of configuration Debug for project Pract2 ****

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -omove.o ..\move.cpp
In file included from ..\/game.h:11:0,
                 from ..\/piece.h:10,
                 from ..\/move.h:10,
                 from ..\move.cpp:7:
..\/board.h:18:2: error: 'Piece' does not name a type

board.h ,第18行:

Piece* GetPieceAt(int row, int col) const;

通常當發生這種情況時,我只需添加一些我忘記做的內容。 但實際上我在board.h的頂部包含了piece.h

我的第二個想法是編譯器必須在Piece類中的某處產生一個錯誤,這會導致編譯器忽略類的存在,這反過來會導致更多的錯誤。 在那種情況下,我會查看第一個編譯器錯誤,我預計這將是關於piece.cpppiece.h中的錯誤。 但是第一個錯誤根本不是關於Piece ,所以我看看Eclipse是否在piece.cpppiece.h中標記了任何錯誤。 不,看不到紅線。 我只看到了一些這些無法解釋的黃色標記

我檢查的最后一件事是每個頭文件包含包含警衛,他們做了。

如何找到此錯誤的底部? 我發布了代碼片段,但后來我可能最終粘貼整個代碼(我不能這樣做),因為可能需要額外的上下文。

編輯 :這是board.h直到第18行。(我遺漏了一個很大的評論,這解釋了為什么這段代碼比你想象的要小。)

#ifndef BOARD_H_
#define BOARD_H_
#include "piece.h"

class Board {
public:
    // Prototypes for externally defined functions
    Board();
    ~Board();
    void PrintBoard();
    Piece* GetPieceAt(int row, int col) const;

最有可能通過“重新排列代碼”,在board.hpiece.h之間創建了一個循環包含。 您的頭文件包含防止在這種情況下無限包含的包含保護,但這無助於編譯聲明。

檢查循環包含並相應地重新考慮包含策略。 如果類型之間沒有任何循環依賴關系,則應該能夠輕松地消除循環包含。 如果類型之間確實存在循環依賴關系,則必須使用某些類型的轉發聲明。 試圖以循環方式包含頭文件將無法實現任何目標。

似乎piece.h和board.h是相互包含的。 如果是這種情況,請嘗試使用兩個類的預先聲明,並僅在cpp文件中包含標頭

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM