我有一个工作项目。重新安排一些代码之后,我尝试重新编译我的项目,然后开始发生奇怪的事情。看看编译器输出中的这段摘录。我正在使用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.cpp 或 piece.h 中的错误。但是第一个错误根本不是Piece
,所以我看看Eclipse是否在 piece.cpp 或 piece.h 中标记了任何错误。不,看不到红线。我只看到了一些these unexplained yellow markers。
我检查的最后一件事是每个头文件都包含包含警卫,他们这样做了。
如何找到此错误的底部?我发布了代码片段,但后来我可能会粘贴整个代码(我不能这样做),因为可能需要额外的上下文。
编辑:这是 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;
答案 0 :(得分:14)
最有可能通过“重新排列代码”,您在board.h
和piece.h
之间创建了一个循环包含。您的头文件包含防止在这种情况下无限包含的包含保护,但这无助于编译声明。
检查循环包含并相应地重新考虑包含策略。如果类型之间没有任何循环依赖关系,则应该能够轻松地消除循环包含。如果类型之间确实存在循环依赖关系,则必须使用某些类型的转发声明。试图以循环方式包含头文件将无法实现任何目标。
答案 1 :(得分:1)
似乎piece.h和board.h是相互包含的。 如果是这种情况,请尝试使用两个类的预解释,并仅在cpp文件中包含标头