我有一个工作项目.重新安排一些代码之后,我尝试重新编译我的项目,然后开始发生奇怪的事情.看看编译器输出中的这段摘录.我正在使用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.cpp或piece.h中的错误.但是第一个错误根本就没有Piece,所以我看看Eclipse是否在piece.cpp或piece.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.您的头文件包含防止在这种情况下无限包含的包含保护,但这无助于编译声明.
检查循环包含并相应地重新考虑包含策略.如果类型之间没有任何循环依赖关系,则应该能够轻松地消除循环包含.如果类型之间确实存在循环依赖关系,则必须使用某些类型的转发声明.试图以循环方式包含头文件将无法实现任何目标.