我有一个严格用于定义,全局数据,typedef等的文件......
gamedata.h
#include <utility>
#include "player.h"
namespace GameData {
enum Color {
BLACK = 0,
WHITE = 1
};
typedef typename std::pair<char, int> Position;
typedef typename std::pair< std::pair<char, int>, std::pair<char, int> > Move;
typedef typename std::pair<Player*, Player*> Players;
};
我遇到两个问题:
(1)找不到播放器类 - 即使我已将其与标题
一起包含在内#include <string>
#include "board.h"
#include "gamedata.h"
class Player {
public:
virtual ~Player() {}
virtual Move getMove(Board &c) = 0;
};
(2)播放器标题中的Move getMove
功能无法解析移动
`Move` does not name a type
我最好的猜测是,这种情况正在发生,因为它是一个循环包含,两者都需要相互包含。
所以我在gamedata.h中转发声明播放器
class Player;
namespace GameData {
enum Color {
BLACK = 0,
WHITE = 1
};
typedef typename std::pair<char, int> Position;
typedef typename std::pair< std::pair<char, int>, std::pair<char, int> > Move;
typedef typename std::pair<Player*, Player*> Players;
};
这解决了播放器的问题,但现在移动仍然不稳定。
// None work
GameData::Move
Move
代码:
修改1
我想改变这个:
typedef typename std::pair< std::pair<char, int>, std::pair<char, int> > Move;
到
typedef typename std::pair<Position, Position> Move;
但我认为它产生了错误,所以我还没有恢复它。
答案 0 :(得分:1)
好吧,我在50次搜索后找到答案哈哈。当我说我试图转发声明class Player
时,我没有删除问题所在的#include "player.h"
。
彼得87的一句话:
你有一个循环依赖。 janitor.h包括lunch.h。 lunch.h包含janitor.h,但是头文件后卫阻止janitor.h被包含,lunch.h失败,因为它取决于janitor.h中的内容。
为防止出现此问题,您可以使用转发声明。
而不是#include“janitor.h”,你写的是班主任;只要您拥有的只是指针或对janitor对象的引用,这将起作用。如果您使用该对象,则需要包含标题,因此在源文件中您可能必须包含它们。对所有其他标题执行相同操作,而不仅仅是janitor.h。一个好的规则就是使用前向声明,如果它足够的话,只有在必要时才包括。