Существует несколько способов обойти это. Один из способов заключаются в использовании пространств имен, чтобы обернуть перечисления и предотвратить значение от загрязнения глобального пространства имен:
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
но есть одно существенное различие. В первом случае перечисления будут по-прежнему неявно отбрасываться в ints. Это означает, что вы можете написать
int foo = direction::NONE;
и все в порядке.
Во втором случае это была бы ошибка компилятора, так как foo не является тем же типом, что и направление. Вы можете обойти эту проблему, делая
direction foo = direction::NONE;
, которые могут или не могут работать на вас. Если вам нужно передать его в int, вы можете использовать static_cast<int>(foo)
, чтобы получить целочисленный тип.
Спасибо, первый метод кажется более эффективным для того, что я делаю прямо сейчас, поэтому я буду придерживаться его. – JorensM