【问题标题】:Is in-class enum forward declaration possible? [duplicate]类内枚举前向声明是否可能? [复制]
【发布时间】:2014-11-19 14:25:01
【问题描述】:

我知道在 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 中可能吗?

【问题讨论】:

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


【解决方案1】:

不,这样的前向声明是不可能的。 [decl.enum]/5(粗体强调我的):

如果 enum-key 后跟 nested-name-specifier,则 enum-specifier 应引用以前的枚举 直接在类或命名空间中声明 nested-name-specifier 指代(即既不继承也不引入 通过 using-declaration),并且 enum-specifier 应出现在 包含先前声明的命名空间。

(在这种情况下,nested-name-specifier 将是您的班级名称,后跟 ::。)
不过,您可以将枚举放在外面并使用 opaque-enum-declaration。

【讨论】:

    【解决方案2】:

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

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

    class Foo
    {
        enum E : short;
    };
    
    void foo(Foo::E e);
    
    enum Foo::E : short
    {
         VALUE_1,
         VALUE_2,
        ....
    };
    

    当然,您这样做是否获得任何好处取决于具体情况。

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2023-03-27
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      相关资源
      最近更新 更多