Можно ли сделать два разных перечисления с одинаковым значением?
Например,
enum direction{
LEFT,
RIGHT,
UP,
DOWN,
NONE
}
enum color{
RED,
GREEN,
BLUE,
NONE
}
Компилятор сказал бы, что есть два объявления NONE.
Это можно обойти?
Есть несколько способов обойти это. Одним из способов является использование пространств имен для переноса перечислений и предотвращения загрязнения этими значениями глобального пространства имен:
namespace direction {
enum direction {
LEFT,
RIGHT,
UP,
DOWN,
NONE
};
}
namespace color {
enum color {
RED,
GREEN,
BLUE,
NONE
};
}
Вы также можете использовать новый способ C ++ 11 (если ваш компилятор его поддерживает) и использовать «строго типизированные перечисления»
enum class direction {
LEFT,
RIGHT,
UP,
DOWN,
NONE
};
enum class color {
RED,
GREEN,
BLUE,
NONE
};
Оба могут быть использованы синтаксисом direction::NONE
или же color::NONE
но есть одно важное отличие. В первом случае перечисления по-прежнему неявно приводятся к целым числам. Это означает, что вы можете написать
int foo = direction::NONE;
и все хорошо.
Во втором случае это будет ошибка компилятора, так как foo не того же типа, что и direction. Вы можете обойти это, делая
direction foo = direction::NONE;
который может или не может работать для вас. Если вам нужно привести его к int, вы можете использовать static_cast<int>(foo)
чтобы получить целочисленный тип.
Других решений пока нет …