6

私はこのコードを使用しました:

enum E {
    E1, E2, E3, MaxNum
};

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};

問題はありませんでした。今、私は "modern" を使いたいと思っていますenum class。コードは次のようになります。

enum class E {
    E1, E2, E3, MaxNum
};

const char * ENames[ E::MaxNum ] = {
    "E1", "E2", "E3"
};

エラーが発生しました

エラー: 配列 'ENames' のサイズに非整数型 'E' があります</p>

エラー: 'const char* [1]' の初期化子が多すぎます</p>

Q:enum class通常の enum が整数であるのに、なぜ c++11 で非整数になるのですか?

問題の決定とは?の列挙の1つであるサイズの配列を宣言するにはどうすればよいenum classですか?

ここ - http://ideone.com/SNHTYe - は簡単な例です。

ありがとうございました。

4

2 に答える 2

7

Q:enum class通常の enum が整数であるのに、なぜ c++11 で非整数になるのですか?

「通常の列挙型」ではないため、より強く型付けされています

enum class の列挙の 1 つであるサイズの配列を宣言するにはどうすればよいですか?

そもそもなんでしたいの?を使用できますstatic_castが、問題の解決策は「それをしないでください」です。

固定の基になる型の列挙型が必要な場合は、スコープ付き列挙型を使用しないでください。

enum E : uint16_t {
    E1, E2, E3, MaxNum
};

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};
于 2013-06-28T08:45:23.963 に答える
5

C++11 5.19/3「定数式」

整数定数式は、整数型またはスコープなし列挙型のリテラル定数式です。

スコープ付き列挙は整数定数式ではありません。また、配列の次元 (指定されている場合) は、「整数定数式であり、その値は 0 より大きくなければならない」(8.3.4/1「配列」) でなければなりません。

これの根拠は、スコープ付き列挙型が暗黙的に に変換されないことだと思いintます。

この問題を回避するにはint、user2523017 によって提案されているようにスコープ付き列挙型を静的にキャストするか、C++11 より前の列挙型名のメソッドを使用します。

namespace E {
enum {
      E1, E2, E3, MaxNum
    };
}

また:

struct E {
enum {
      E1, E2, E3, MaxNum
    };
};
于 2013-06-28T07:47:12.633 に答える