2014-10-19 2 views
2

Допустим, у меня есть класс, который содержит две перечисления.C++ Enum Names Overlap

enum NameType { Defined, Inherited }; 
    enum ValueType { Defined, Inherited }; 

Значение нумерации, как говорит, «определенно ранее» во втором перечислении, потому что они имеют те же имена, что и первое перечисление. Есть ли синтаксис, который является кратким и позволяет использовать эти имена?

Я знаю, что на C# это не проблема, но на C++ это похоже. Я использую C++ 11.

+0

Можете ли вы использовать класс переименования C++ 11? http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html – NPE

+0

Скажите 'enum class NameType {Defined, Inherited};', чтобы сделать их отличными. –

+0

Да. Использование C++ 11. –

ответ

8

Поскольку вы используете C++ 11, я бы рекомендовал использовать enum class.

enum class NameType { Defined, Inherited }; 
enum class ValueType { Defined, Inherited }; 

Это исправление проблемы с определением области охвата.

См. http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html для дальнейшего обсуждения enum class.

+0

Спасибо. Вот и все. Я пропустил, как следует добавлять ключевое слово класса. –

+0

Стоит использовать его настоящее имя: _scoped enums_. Это отдельная функция из перечислений. –

+0

@russ note Это сильно меняет информацию о том, как работает enum. Нет более неявного преобразования! – Yakk

1

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

enum NameType { NT_Defined, NT_Inherited }; 
enum ValueType { VT_Defined, VT_Inherited }; 
1

Если вы не C++ 11 компилятора, вы можете использовать пространство имена или классы:

namespace Solar 
{ 
    enum NameType { Defined, Inherited }; 
} 

namespace Lunar 
{ 
    enum ValueType { Defined, Inherited }; 
} 

Конечно, если вы используете using namespace, компилятор может дать ошибку для двусмысленности. Но эту ошибку легко решить, просто используя полное имя. Аналогичным образом вы также можете определить перечисления в области public класса.

+1

Я на самом деле в конце концов решил использовать это решение, так что мне не нужно определять свои собственные бит-мудрые операторы |, &, ==,! =. Это, по-видимому, довольно сломанная особенность строго типизированных перечислений, что по умолчанию у них нет рабочих операторов. –