2011-09-13 14 views
2

同じブロック内の同じ値を持つ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と呼びます。だから、彼らは同じ範囲で許可されていません。

これを克服するには、namespaceまたはclassに囲むことができます。あなたがenum classを使用することができますC++ 11では

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

(それがタイトな型チェックを持ち、そして、彼らは暗黙のうちにintに変換されません)。

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

+1のC++ 0x構文では、C++ 0xを使用している人が*スコープのenums *に体系的に移行することを強く推奨します。 –

+0

+1。 *名前のない* enumはテンプレート引数として機能しません。 – Nawaz

+0

OPでは、math_students 'foobar(math_students val)'を受け入れる関数を作成することができました。クラスや名前空間でスコープを設定した場合、これは可能ではありませんか? –

1

値をあいまいにするために、名前で値を参照できます。

3

列挙型の値の有効範囲はありません。列挙型のメンバーは、名前によって直接アクセスされます。したがって、複数の列挙型のメンバーが同じ名前を持つ場合、名前の競合が発生します。

1

enum名を指定せずにこれらの値を参照できるためです。

math_students student = A; 

この場合、これはあいまいなので、コンパイラは許可しません。

+0

enum名を指定せずにこれらの値を参照する必要はありませんが(一部のコンパイラでもサポートされていますが) – Stephan

+0

@Stephan:おそらく既にC++ 11を使用している人がいるかもしれませんが、ここでは* can *;) – PlasmaHH

+0

@PlasmaHH:これは妥当な変更です!私の最初のコメントを忘れて! – Stephan

関連する問題