2014-10-19 151 views
2

可以说我有一个包含两个枚举的类。C++枚举名称重叠

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

在第二个枚举中,数值被认为是“先前定义的”,因为它们与第一个枚举具有相同的名称。有没有一个简洁的语法,并允许这些名称?

我知道在C#中这不是问题,但在C++中似乎是这样。我正在使用C++ 11。

+0

你可以使用C++ 11的'enum class'吗? http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html – NPE 2014-10-19 16:13:07

+0

说'enum class NameType {Defined,Inherited};'使它们不同。 – 2014-10-19 16:13:13

+0

是的。使用C++ 11。 – 2014-10-19 16:13:46

回答

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

谢谢。而已。我错过了应如何添加类关键字。 – 2014-10-19 16:15:20

+0

值得使用它的真名:_scoped enums_。这是一个与枚举不同的功能。 – 2014-10-19 16:20:14

+0

@russ注意,这对enum的运行方式有很大的影响。没有更多的隐式转换! – Yakk 2014-10-19 16:29:53

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

我实际上最终选择了这个解决方案,这样我就不必定义自己的按位|,&,==,!=运算符。这似乎是强类型枚举的一个相当破碎的特性,它们默认情况下没有工作操作符。 – 2014-10-21 22:36:00