首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++如何在不同的枚举名称中使用相同的枚举成员名称,而不会得到err:redefinition;以前的定义是'enumerator‘

c++如何在不同的枚举名称中使用相同的枚举成员名称,而不会得到err:redefinition;以前的定义是'enumerator‘
EN

Stack Overflow用户
提问于 2014-04-25 17:15:34
回答 2查看 20.6K关注 0票数 40

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

代码语言:javascript
复制
enum GameObjectType
{
     NINJA_PLAYER

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


};

但是,当我尝试通过使用正确的枚举名称调用枚举来编译项目时

代码语言:javascript
复制
m_pNinjaPlayer = (NinjaPlayer*)GameFactory::Instance().getGameObj(GameObjectType::NINJA_PLAYER);
    ComponentMadiator::Instance().Register(GameObjectTypeLocation::NINJA_PLAYER,m_pNinjaPlayer);

我收到编译错误:

代码语言:javascript
复制
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中保留多个具有不同名称但具有相同元素名称的枚举?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-25 17:17:32

问题是老式的枚举没有作用域。您可以通过使用作用域枚举来避免此问题(前提是您的编译器具有相关的C++11支持):

代码语言:javascript
复制
enum class GameObjectType { NINJA_PLAYER };

enum class GameObjectTypeLocation { NONE, MASSAGE_ALL, NINJA_PLAYER };

或者,您可以将您的老式枚举放在名称空间中:

代码语言:javascript
复制
namespace foo
{
  enum GameObjectType { NINJA_PLAYER };
} // namespace foo

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

那么您的枚举值将是foo::NINJA_PLAYERbar::NINJA_PLAYER等。

票数 49
EN

Stack Overflow用户

发布于 2014-04-25 17:17:01

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

代码语言:javascript
复制
enum class GameObjectType
{
     NINJA_PLAYER

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


};

编辑:如果您不具备此功能,则需要为每个枚举使用两个不同的名称空间。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23288934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档