同じブロック内の同じ値を持つ2つの列挙型の宣言がC++ではなぜ許可されないのですか?同じ値を持つ列挙型
enum math_students {A,B,C};
enum comp_students {D,E,A}; // illegal
同じブロック内の同じ値を持つ2つの列挙型の宣言がC++ではなぜ許可されないのですか?同じ値を持つ列挙型
enum math_students {A,B,C};
enum comp_students {D,E,A}; // illegal
C++ 03 enum
は、スコープの下で厳密な型チェックを行いません。したがって、math_students::A
とcomp_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のC++ 0x構文では、C++ 0xを使用している人が*スコープのenums *に体系的に移行することを強く推奨します。 –
+1。 *名前のない* enumはテンプレート引数として機能しません。 – Nawaz
OPでは、math_students 'foobar(math_students val)'を受け入れる関数を作成することができました。クラスや名前空間でスコープを設定した場合、これは可能ではありませんか? –