让我们采用我最近在项目中某处找到的代码构造:
namespace Test
{
enum EName
{
CoolEnum,
NiceEnum
};
enum CoolEnum
{
CoolVal1,
CoolVal2
};
enum NiceEnum
{
NiceVal1,
NiceVal2
};
}
我的问题是为什么编译器允许这样的事情。让我们在这里看一个代码示例:
Test::CoolEnum cEnum = Test::NiceVal1; // INVALID, as compiler refers to Test::CoolEnum value of Test::Ename enum
为什么允许这样的混淆?我明白为什么我必须在 enum 关键字前面加上,所以编译器清楚地知道我正在声明给定枚举的变量,而不是在同一命名空间中使用其他枚举的值。我只是不明白为什么一开始甚至可以进行这样的构造。
最佳答案
C++11 的枚举类是解决这个问题的方法:
namespace Test
{
enum class EName
{
CoolEnum,
NiceEnum
};
enum class CoolEnum
{
NiceVal1,
NiceVal2
};
enum class NiceEnum
{
NiceVal1,
NiceVal2
};
}
然后你可以使用合适的NiceVal1
:
Test::CoolEnum cEnum = Test::CoolEnum::NiceVal1;
普通枚举是从 C 继承而来的,其中没有命名空间是什么的概念。如果普通枚举引入了某种命名空间,那么使用枚举的 C 代码将根本无法编译。这就是引入枚举类的原因,以免破坏向后兼容性。
关于c++ - 枚举值与枚举名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363737/