2011-09-13 164 views
2

为什么在C++中不允许在同一个块中声明两个具有相同值的枚举?具有相同值的枚举类型

enum math_students {A,B,C}; 
enum comp_students {D,E,A}; // illegal 

回答

3

C++ 03 enum在其范围内没有更严格的类型检查。所以math_students::Acomp_students::A都可以简称为A。这就是为什么他们不能在同一个范围内。

为了克服这一点,你可以把它们放在namespaceclass

namespace math_students { 
    enum { A, B, C }; 
} 
namespace comp_students { 
    enum { D, E, A }; // ok 
} 

在C++ 11可以使用enum class(它有更严格的类型检查,他们没有得到隐式转换为int)。

enum class math_students {A,B,C}; 
enum class comp_students {D,E,A}; // ok 
+1

对于C++ 0x语法,我强烈建议使用C++ 0x的人有系统地迁移到* scoped枚举*。 –

+0

+1。请注意,* unnamed *枚举不会作为模板参数。 – Nawaz

+0

在OP中,我可以创建一个接受math_students'foobar(math_students val)'的函数。如果我将它们放在类或名称空间中,这是不可能的吗? –

1

您可以通过它们的名称引用这些值,这样就会模糊不清。

3

enum中的值没有作用域。枚举的成员可以直接通过他们的名字来访问。因此,如果多个枚举具有相同名称的成员,将会有一个命名冲突。

1

因为您可以在不指定枚举名称的情况下引用这些值。

math_students student = A; 

在你的情况下,这将是不明确的,因此,编译器不允许。

+0

您不仅可以_can_,而且您还需要引用这些值_without_指定枚举名称(尽管有些编译器支持它)。 – Stephan

+0

@Stephan:我们中的一些人可能已经在使用C++ 11太多了,它是* can *;) – PlasmaHH

+0

@PlasmaHH:这是一个合理的改变!忘掉我的第一条评论! – Stephan