我知道在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中是否可以这样?
答案 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,
....
};
这样做是否会带来任何好处当然取决于具体情况。