С++, как иметь такое же имя члена перечисления в разных именах перечислений, не получая 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 несколько перечислений с разными именами, но с такими же именами элементов?
Ответы
Ответ 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
};
Изменить: если у вас нет этой возможности, вам нужно будет использовать два разных пространства имен для каждого перечисления.