1

デフォルトの int 実装で C++11 スコープの列挙型を使用したい:

enum class Color
{
    gray          = 1,  
    red           = 2
};

これは gcc でコンパイルされますが、次のようになります。

Color color = Color::red;  // 'Color' is not a class or a namespace
Color color = red;         // 'red' was not declared in this scope

私は何を間違っていますか?

編集:

これはコンパイル可能であるべきですが、少なくとも私にとってはそうではありません。gcc バージョン 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) を使用しています。私がしようとすると:

 make -std=c++0x -w in /home/martin/Projects/StrongTypedEnums-build-desktop 

私は得る

:-1: error: invalid option -- '='. 

私はIDEを介してすべてを行っており、コンパイラの引数を渡すことについてまったく知りません。

enum class Color
{
    gray          = 1,
    red           = 2
};

int main(int argc, char *argv[])
{
    Color color = Color::red; // 'Color' is not a class or a namespace
    return 0;
}
4

2 に答える 2

4

厳密に型指定された列挙にはスコープが必要です。クラスのメンバーであるかのように、接頭辞を付ける必要があります。C++11 の通常の列挙型にはオプションで接頭辞を付けることができますが、厳密に型指定された列挙型には必要です。EnumName::static

C++11 では、列挙型に基本的に 3 つの新機能が追加されました。

  • 明示的な入力 ( enum class EnumName : int)
  • レキシカルスコープ (EnumName::構文)
  • タイピングが強い。

最初の 2 つは通常の列挙型で取得できます (後方互換性により、非列挙型ではどちらもオプションになりますclass)。しかし、強力な型付けを取得する唯一の方法は、他の両方を必要とする を使用することです (宣言にenum class明示的な型を指定しない場合は、 を使用すると思います)。enum classint

スコープが強制されているということは、通常、es の列挙子名を ALL_CAPS する必要がないことを意味しますenum class

于 2012-04-09T04:42:02.180 に答える
1

GCCを使用してCode::Blocks 10.05を使用すると、同じ問題が発生しました。

私がしなければならなかったのは、[プロジェクト] > [ビルド オプション] に移動し、左側のペインでプロジェクト名を選択することでした (「デバッグ」または「リリース」ではありません)。次に、選択したコンパイラー「GNU GCC Compiler」の下で、「Compiler Settings」の「Compiler Flags」の下で、「g++ を今後の C++0x ISO C++ 言語標準 [-std=c++0x] に準拠させる」にチェックを入れました。

于 2013-11-11T18:00:35.257 に答える