Подтвердить что ты не робот

С++, как иметь такое же имя члена перечисления в разных именах перечислений, не получая err: redefinition; предыдущее определение было "перечислителем"

У меня есть файл конфигурации, который я включаю во все мои файлы там у меня разные перечисления, но внутри каждого перечисления есть одинаковые имена элементов например: 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 несколько перечислений с разными именами, но с такими же именами элементов?

4b9b3361

Ответ 1

Проблема в том, что перечисления в старом стиле не облагаются. Вы можете избежать этой проблемы (при условии, что ваш компилятор имеет соответствующую поддержку С++ 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_PLAYER, bar::NINJA_PLAYER и т.д.

Ответ 2

Если у вас есть возможность использовать С++ 11, я бы рекомендовал использовать функцию класса enum, чтобы избежать столкновений:

enum class GameObjectType
{
     NINJA_PLAYER

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


};

Изменить: если у вас нет этой возможности, вам нужно будет использовать два разных пространства имен для каждого перечисления.