课堂上的enum前言可能吗?

时间:2014-11-19 14:25:02

标签: c++ c++11 enums nested forward-declaration

我知道在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中是否可以这样?

2 个答案:

答案 0 :(得分:8)

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

  

如果 enum-key 后跟嵌套名称说明符    enum-specifier 应引用之前的枚举   直接在类或名称空间中声明的    nested-name-specifier 引用(即,既不继承也不引入   通过使用声明), enum-specifier 应出现在   封闭前一个声明的命名空间。

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

答案 1 :(得分:3)

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

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

class Foo
{
    enum E : short;
};

void foo(Foo::E e);

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

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