错误:'...'没有命名类型

Pie*_*ter 5 c++

我有一个工作项目.重新安排一些代码之后,我尝试重新编译我的项目,然后开始发生奇怪的事情.看看编译器输出中的这段摘录.我正在使用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
Run Code Online (Sandbox Code Playgroud)

board.h,第18行:

Piece* GetPieceAt(int row, int col) const;
Run Code Online (Sandbox Code Playgroud)

通常当发生这种情况时,我只需添加一些我忘记做的内容.但实际上我在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;
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 14

最有可能通过"重新排列代码",在board.h和之间创建了循环包含piece.h.您的头文件包含防止在这种情况下无限包含的包含保护,但这无助于编译声明.

检查循环包含并相应地重新考虑包含策略.如果类型之间没有任何循环依赖关系,则应该能够轻松地消除循环包含.如果类型之间确实存在循环依赖关系,则必须使用某些类型的转发声明.试图以循环方式包含头文件将无法实现任何目标.