8

この質問には、次のような回答があります。

typedef を使用して、「フルネーム」を指定せずに Color 列挙型にアクセスできるようにすることができます。

typedef Sample::Colour Colour;
Colour c = Colour::BLUE;

それは私には正しいように聞こえますが、誰かが反対票を投じて、次のコメントを残しました。

("Colour::BLUE" のように) 列挙型でスコープ解決演算子 :: を使用することは、標準の C++ ではなく、コンパイラ固有の拡張機能です。

本当?確かではありませんが、MSVCとGCCの両方でそれを使用したと思います。

4

5 に答える 5

8

それは標準ではありません。

C++11 では、 enum クラス宣言を使用してスコープ付き列挙型を作成できます。

C++11 より前のコンパイラでは、列挙型のスコープを設定するには、構造体または名前空間内で列挙型を定義する必要があります。

于 2009-01-14T02:40:36.937 に答える
8

次のコードを試しました:

enum test
{
    t1, t2, t3
};

void main() 
{
    test t = test::t1;
}

Visual C++ 9 でコンパイルすると、次の警告が表示されます。

警告 C4482: 非標準の拡張子が使用されています: 列挙型 'test' が修飾名で使用されています

標準とは思えません。

于 2009-01-14T01:50:35.930 に答える
4

標準の C++ では、"::" の左側にあるものはクラスまたは名前空間でなければならず、列挙型はカウントされません。

于 2009-01-14T01:49:37.120 に答える
0

これを回避するためにできることは、列挙と同じ名前の名前空間を作成することです。これにより、列挙値が独自のスコープに効果的に追加され、列挙/名前空間の名前を使用してそれらを参照できます。もちろん、そうでなければグローバル(または別の名前空間)スコープに存在する列挙に対してのみ機能します。

この問題に関する記事もどこかにあります。

于 2009-01-14T01:52:25.053 に答える