C++ C++;标头命名空间中包含的typedef找不到类型
我有一个文件,这是严格的定义,全球数据,typedefs等 gamedata.hC++ C++;标头命名空间中包含的typedef找不到类型,c++,types,typedef,typename,C++,Types,Typedef,Typename,我有一个文件,这是严格的定义,全球数据,typedefs等 gamedata.h #include <utility> #include "player.h" namespace GameData { enum Color { BLACK = 0, WHITE = 1 }; typedef typename std::pair<char, int> Position; typedef typename st
#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;
};
我最好的猜测是,这是因为这是一个循环包含,两者都需要相互包含
所以我在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;
};
代码:
编辑1
我想改变这一点:
typedef typename std::pair< std::pair<char, int>, std::pair<char, int> > Move;
typedef typename std::pairMove;
到
typedef typename std::对移动;
但我认为它产生了错误,所以我还没有将其还原。好吧,我在50次搜索后找到了答案哈哈。当我说我试图转发声明
class Player
时,我没有删除问题所在的#include“Player.h”
彼得87的一句话:
你有一个循环依赖。看门人。h包括午餐。h。午餐.h包括门卫.h,但页眉防护装置阻止门卫.h包括在内,午餐.h失败,因为这取决于门卫.h中的内容
要防止此问题,可以使用转发声明
你写的不是“看门人.h”,而是“班看门人”;只要您只有指向看门人对象的指针或引用,这就可以工作。如果使用该对象,则需要包含头文件,因此在源文件中可能必须包含头文件。对所有其他标题都做同样的处理,而不仅仅是看门人。一个好的规则是在足够的情况下使用前向声明,并且只有在必要时才包含
来源:不使用模板时不要使用typename。你应该使用防护装置#如果你在最初的问题中说你尝试了这个,但仍然没有成功,那么,如果你尝试了这个,那么,定义玩家?你能解释一下Peter87的评论吗?这样我就能理解他所建议的和你最初尝试的之间的区别了?谢谢:)
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
typedef typename std::pair< std::pair<char, int>, std::pair<char, int> > Move;
typedef typename std::pair<Position, Position> Move;