错误:没有命名类型
ERROR: does not name a type
我正在用c++实现一个国际象棋游戏,其中一些类是"Board"answers"Piece"。有"车"、"国王"、……等继承自"Piece"
一个棋盘是一个二维的棋子数组所以board。h包含了piece。h
对于最近的开发(关于执行移动),我想让棋子进入棋盘。所以在piece.h中我包含了board.h.
现在会产生上面的错误。
一些代码://Function in piece.h
#include "board.h"
bool Piece::move( int toX, int toY, bool enemyPawn, const Board & b )
<>之前错误:板没有命名类型错误:ISO c++禁止声明没有类型[-fpermissive]的' b ' 因为move只使用了一个引用,所以你完全可以避免包含Board. h而只向前声明你的类Board。如果你真的需要棋子知道棋盘,棋盘也知道棋子,你可以为棋盘声明一个接口类(纯抽象),并包括那个接口,而不是棋盘,确保让棋盘从接口派生——Martin刚才编辑
在board.h
中:将class Board;
(带分号!)放在include piece.h
之前
在piece.h
中:将class Piece;
(带分号!)放在include board.h
之前。
一般来说,如果我在头文件中定义一个类,我会将class <classname>;
放在文件的顶部,在任何include 之上。
你有一个所谓的循环依赖。两个标头都试图包含对方,要么失败(如果您有包含保护),要么无限循环(没有保护)。不管怎样,这个"前向声明"应该能解决问题。
如果这些类被捆绑在一起而不能修复它们,你将不得不"解开"它们。将piece/bishop/king/etc的函数定义移动到各自的.cpp
文件(如果它们还没有),确保头文件只使用board&
和board*
(但不使用board
),然后用class board;
替换#include "board";
。这告诉编译器存在一个"未知"的板类型,它可以通过指针和引用传递它。然后piece.h
将有没有依赖关系,并且可以像board.h
一样正确地从任何文件中包含。
这是一个循环依赖。我最近读到的一个提示是,想象一下如何在一个头文件中定义这两个类,这样每个类都知道对方;答案是,你不能。
要打破循环依赖,你需要对其中一个类使用前向声明,而不是包括它的头文件。不做#include "board.h"
,只做class Board;
。
您可以使用pimpl模式:参见http://www.gotw.ca/gotw/024.htm
- 类没有命名C++代码中的类型错误
- 不完整类型错误(E0409、E0070、E0515)
- 使用具有结构不完整类型错误的模板
- 不命名构造函数和析构函数上的类型错误
- 返回派生类型时出现协变类型错误
- 为什么此构造函数没有给出不完整的类型错误?
- 定义模板化结构的特征时出现不完整的类型错误
- 使用重载构造函数时出现不完整的类型错误
- 为什么我得到表达式必须有类类型错误?
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 枚举成员不是类型错误
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 非默认析构函数会导致不完整的类型错误
- 为什么按引用传入会导致绑定引用类型错误
- Objective-C C++ 包装器 类型错误的不完整定义
- 输入类型错误
- 当构造函数的参数类型错误时引发异常
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- C UNWORKOWN类型错误