课堂上的enum前言可能吗?

tom*_*myk 17 c++ enums nested forward-declaration c++11

我知道在C++ 11中可以转发声明枚举类型(如果提供了存储类型),例如

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

....

enum E : short
{
    VALUE_1,
    VALUE_2,
    ....
}
Run Code Online (Sandbox Code Playgroud)

但我想转发声明在类中定义的枚举,例如

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

....

class Foo
{
    enum E : short
    {
        VALUE_1,
        VALUE_2,
    ....
    }
}
Run Code Online (Sandbox Code Playgroud)

在C++ 11中是否可以这样?

Col*_*mbo 9

不,这样的前瞻性声明是不可能的.[decl.enum]/5(大胆强调我的):

如果枚举键之后是嵌套名称说明符,枚举说明符应引用先前在嵌套名称说明符所引用的类或命名空间中直接声明的枚举 (即,既不继承也不引入通过using-declaration),enum-specifier应出现在包含前一个声明的命名空间中.

(在这种情况下,嵌套名称说明符将是您的类的名称后跟一个::.)
但是,您可以将枚举放在外部并使用opaque-enum-declaration.


Jer*_*emy 5

正如@Columbo 所说,您不能以您指定的形式声明它。

但是,您可以在类声明中转发声明嵌套的枚举:

class Foo
{
    enum E : short;
};

void foo(Foo::E e);

enum Foo::E : short
{
     VALUE_1,
     VALUE_2,
    ....
};
Run Code Online (Sandbox Code Playgroud)

当然,这样做是否会带来任何好处取决于具体情况。