2011-09-13 204 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