c++ - 枚举值与枚举名称冲突

标签 c++ gcc enums

让我们采用我最近在项目中某处找到的代码构造:

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/

相关文章:

c - gcc:如何避免对程序集中定义的函数发出 "used but never defined"警告

c++ - 平面方程的多面体

c++ - 如何将地址转换为 GDB 中的特定类型变量?

C++ 概念 访问公共(public)方法

c - c 结构中的压缩位字段 - GCC

c# - 使用枚举(构建列表)

c++ - 访问结构中定义的枚举值

具有多个字符串值的 typescript 枚举

C++ 重载 : switching from friend to member function

c++ - 如何在 Visual Studio 10 中生成自定义生成错误