c ++如何在不同的枚举名称中使用相同的枚举成员名称而不会出现错误:redefinition;之前的定义是'枚举器'

时间:2014-04-25 09:15:34

标签: c++ enums

我的配置文件包含在我的所有文件中 在那里我有不同的枚举,但在每个枚举中有相同的元素名称 例如:config.h

enum GameObjectType
{
     NINJA_PLAYER

};
enum GameObjectTypeLocation
{
    NONE,
    MASSAGE_ALL,  //this is for ComponentMadiator
    NINJA_PLAYER


};

但是当我尝试使用适当的枚举名称

调用枚举来编译项目时
m_pNinjaPlayer = (NinjaPlayer*)GameFactory::Instance().getGameObj(GameObjectType::NINJA_PLAYER);
    ComponentMadiator::Instance().Register(GameObjectTypeLocation::NINJA_PLAYER,m_pNinjaPlayer);

我收到编译错误:

error C2365: 'NINJA_PLAYER' : redefinition; previous definition was 'enumerator' (..\Classes\GameFactory.cpp)
2>          d:\dev\cpp\2d\cocos2d-x-3.0\cocos2d-x-3.0\projects\lettersfun\classes\config.h(22) : see declaration of 'NINJA_PLAYER'

如何在config.h中保留几个具有不同名称但具有相同元素名称的枚举?

2 个答案:

答案 0 :(得分:39)

问题是旧式枚举是无范围的。您可以通过使用范围枚举来避免此问题(假设您的编译器具有相关的C ++ 11支持):

enum class GameObjectType { NINJA_PLAYER };

enum class GameObjectTypeLocation { NONE, MASSAGE_ALL, NINJA_PLAYER };

或者,您可以将旧学校的枚举放在名称空间中:

namespace foo
{
  enum GameObjectType { NINJA_PLAYER };
} // namespace foo

namespace bar
{
  enum GameObjectTypeLocation { NONE, MASSAGE_ALL, NINJA_PLAYER };
} // namespace bar

然后您的枚举值将为foo::NINJA_PLAYERbar::NINJA_PLAYER等。

答案 1 :(得分:6)

如果您有可能使用C ++ 11,我建议使用枚举类功能来避免冲突:

enum class GameObjectType
{
     NINJA_PLAYER

};
enum class GameObjectTypeLocation
{
    NONE,
    MASSAGE_ALL,  //this is for ComponentMadiator
    NINJA_PLAYER


};

编辑:如果你没有这种能力,那么你需要为每个枚举使用两个不同的命名空间。