是否可以在类内声明枚举类型?

26

我知道在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中是否可能实现这样的功能?


1
在枚举类型之前使用类的前向声明,例如 class Foo;,怎么样? - Fredrick Gauss
1
我怀疑这是不可能的。你不能提前声明成员函数、typedef等等。为什么这会有所不同呢?(C++类是封闭的,意味着它们在定义后无法编辑。)另请参见https://dev59.com/pEfRa4cB1Zd3GeqP9n8a。 - IdeaHat
与类不同,命名空间可以从任何地方添加。为什么不把枚举和类放入命名空间中呢? - Khouri Giordano
1
可能是C++前向声明类作用域枚举的重复问题,相关链接https://dev59.com/73E95IYBdhLWcg3wmvGh。 - Ciro Santilli OurBigBook.com
2个回答

15
不,这样的前向声明是不可能的。[decl.enum]/5 (粗体强调是我的): 如果enum-key后面跟着一个嵌套名称指示符,则枚举说明符必须引用先前在该嵌套名称指示符所指向的类或命名空间中直接声明的枚举(即既不是继承的,也不是通过using-declaration引入的),并且enum-specifier必须出现在封闭前一声明的命名空间中。(在这种情况下,嵌套名称指示符将是您的类名,后面跟着一个::。) 不过,您可以将枚举放在外部并使用不透明的枚举声明。

6

正如 @Columbo 所说,你不能按照你指定的方式声明它。

然而,你可以在类声明中前向声明嵌套枚举:

class Foo
{
    enum E : short;
};

void foo(Foo::E e);

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

当然,你是否从中受益取决于具体情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接