错误:'...'不是一种类型。

6

我之前有一个正在运行的项目。在重新排列了一些代码后,我试图重新编译我的项目,然后奇怪的事情开始发生。请看编译器输出中的这一部分内容。我是使用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;

如果AndreyT的答案无法解决问题,请至少发布board.h的头文件直到第18行。 - Greg Domjan
2个回答

14

很可能是“重新排列代码”的过程中在board.hpiece.h之间创建了循环包含关系。你的头文件包含预处理器指令防止了这种情况下的无限嵌套,但这并不能使声明编译通过。

检查是否存在循环包含关系,并相应地重新思考你的包含策略。如果类型之间不存在循环依赖,你应该能够轻松消除循环包含。如果类型之间存在循环依赖,你需要为一些类型进行前向声明。试图以循环方式包含头文件将毫无作用。


+1 - 尽管在 board.h 文件中放置 class Piece; 可能会解决这个问题。 - Steve Townsend
1
是的,你发现了些什么!Board 包含 PiecePiece 包含 GameGame 又包含 Board,这个过程会无限循环下去。 - Pieter

1

看起来 piece.h 和 board.h 互相包含了。 如果是这种情况,请尝试使用两个类的预声明,并仅在 cpp 文件中包含头文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接