Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;标头命名空间中包含的typedef找不到类型_C++_Types_Typedef_Typename - Fatal编程技术网

C++ C++;标头命名空间中包含的typedef找不到类型

C++ 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

我有一个文件,这是严格的定义,全球数据,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 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;