c – 与枚举名称的枚举值冲突

让我们采用我最近在项目中找到的代码构造:
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+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...