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

时间:2010-10-18 16:18:30

标签: 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

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;

2 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:1)

似乎piece.h和board.h是相互包含的。 如果是这种情况,请尝试使用两个类的预解释,并仅在cpp文件中包含标头