来自头命名空间的C ++ typedef包含物找不到类型

时间:2014-01-16 14:42:09

标签: c++ types typedef typename

我有一个严格用于定义,全局数据,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

代码:

http://pastebin.com/i0GJz6xt

修改1

我想改变这个:

    typedef typename std::pair< std::pair<char, int>, std::pair<char, int> > Move;

    typedef typename std::pair<Position, Position> Move;

但我认为它产生了错误,所以我还没有恢复它。

1 个答案:

答案 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。一个好的规则就是使用前向声明,如果它足够的话,只有在必要时才包括。

来源:http://www.cplusplus.com/forum/general/56475/