可以说我有一个包含两个枚举的类。C++枚举名称重叠
enum NameType { Defined, Inherited };
enum ValueType { Defined, Inherited };
在第二个枚举中,数值被认为是“先前定义的”,因为它们与第一个枚举具有相同的名称。有没有一个简洁的语法,并允许这些名称?
我知道在C#中这不是问题,但在C++中似乎是这样。我正在使用C++ 11。
可以说我有一个包含两个枚举的类。C++枚举名称重叠
enum NameType { Defined, Inherited };
enum ValueType { Defined, Inherited };
在第二个枚举中,数值被认为是“先前定义的”,因为它们与第一个枚举具有相同的名称。有没有一个简洁的语法,并允许这些名称?
我知道在C#中这不是问题,但在C++中似乎是这样。我正在使用C++ 11。
由于您使用的是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
的进一步讨论。
谢谢。而已。我错过了应如何添加类关键字。 – 2014-10-19 16:15:20
值得使用它的真名:_scoped enums_。这是一个与枚举不同的功能。 – 2014-10-19 16:20:14
@russ注意,这对enum的运行方式有很大的影响。没有更多的隐式转换! – Yakk 2014-10-19 16:29:53
您也可以通过在枚举名称的缩写前加上所有的枚举来解决这个问题。这是多少库处理这个。在你的情况,这将是结果:
enum NameType { NT_Defined, NT_Inherited };
enum ValueType { VT_Defined, VT_Inherited };
如果你没有C++编译器11,可以使用命名空间或类:
namespace Solar
{
enum NameType { Defined, Inherited };
}
namespace Lunar
{
enum ValueType { Defined, Inherited };
}
当然,如果你使用using namespace
,编译器可能会给出模糊不清的错误。但是,通过使用完全限定的名称很容易解决该错误。在类似的行上,你也可以定义一个类的public
区域的枚举。
我实际上最终选择了这个解决方案,这样我就不必定义自己的按位|,&,==,!=运算符。这似乎是强类型枚举的一个相当破碎的特性,它们默认情况下没有工作操作符。 – 2014-10-21 22:36:00
你可以使用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
说'enum class NameType {Defined,Inherited};'使它们不同。 – 2014-10-19 16:13:13
是的。使用C++ 11。 – 2014-10-19 16:13:46