web-dev-qa-db-ja.com

クラス内の列挙型前方宣言は可能ですか?

C++ 11では、列挙型を前方宣言することが可能であることを知っています(ストレージタイプが提供されている場合)。

enum E : short;
void foo(E e);

....

enum E : short
{
    VALUE_1,
    VALUE_2,
    ....
}

しかし、クラス内で定義された列挙型を前方宣言したいと思います。

enum Foo::E : short;
void foo(E e);

....

class Foo
{
    enum E : short
    {
        VALUE_1,
        VALUE_2,
    ....
    }
}

このようなことはC++ 11で可能ですか?

19
tommyk

いいえ、そのような前方宣言は不可能です。 [decl.enum]/5(太字の強調鉱山):

enum-keyの後にnested-name-specifierが続く場合、enum-specifierは、nested-name-specifierが参照するクラスまたは名前空間で以前に直接宣言された列挙型を参照します(つまり、 、using-declarationによって継承も導入もされません)、およびenum-specifierは、前の宣言を囲む名前空間に表示されます。

(この場合、nested-name-specifierは、クラスの名前の後に::が続きます。)
ただし、列挙型を外部に配置して、opaque-enum-declarationを使用することはできます。

9
Columbo

@Columboが言うように、指定した形式で宣言することはできません。

ただし、クラス宣言内でネストされた列挙型を前方宣言することはできます。

class Foo
{
    enum E : short;
};

void foo(Foo::E e);

enum Foo::E : short
{
     VALUE_1,
     VALUE_2,
    ....
};

もちろん、そうすることで利益が得られるかどうかは、状況によって異なります。

4
Jeremy