C++11 基类中枚举的正向声明,派生类中的定义

C++11 基类中枚举的正向声明,派生类中的定义,c++11,enums,forward-declaration,C++11,Enums,Forward Declaration,因此,我试图在声明位于基类中的派生类中定义枚举。它看起来像这样: class A { public: enum class E; virtual int foo () = 0; }; class B : public A { public: enum class E { C, D }; int foo () { E e = E::C; return 0; } }; int main() { B b

因此,我试图在声明位于基类中的派生类中定义枚举。它看起来像这样:

class A {
    public:
    enum class E;
    virtual int foo () = 0;
};

class B : public A {
    public:
    enum class E { C, D };
    int foo () {
        E e = E::C;
        return 0;
    }
};

int main() {
    B b;
    A *a = &b;
    a->foo();
}
这将起作用(编译器GCC4.8,compile命令:g++-std=c++11…),但是我想知道是否有更好的方法来做到这一点,这样我就不必每次都要使用enum编写E::了

编辑:我错误地认为这是可行的,然而,这并不是一个真正的正向声明,而是两个不同的枚举类a::E和B::E

我想知道是否有更好的方法来实现这一点,这样我就不必每次都使用enum编写E::了

这与远期申报无关。您必须编写
E::
,因为您使用的是
enum类

如果您不想这样做,请改用旧的
enum

class B : public A {
    public:
    enum E { C, D };
    // ...
};

还不完全清楚你想要完成什么。
enum
定义了一个类型,因此每次定义
enum
时都定义了一个新类型。这些类型之间没有关系,而类是为数不多的几个有关系的类型之一

那么,如果你有以下两个类

class A {

  public:

    enum class E {
      X,
      Y
    };

 };

class B : public A {

  public:

    enum class E {
      V,
      W
    };

 };

类型
A::E
B::E
是不同的类型。无论类的层次结构如何,它们之间都没有任何关系。

我不必每次都写E::我必须使用枚举——然后使用旧的
enum
而不是
enum类
。为什么需要在基类中声明?这样做有什么作用吗?您声明有一个a::E,然后您就不用它了。这可能与你当时的B::E无关define@sp2danny是的,看来你是对的。有什么方法可以在基类中前向声明枚举并在派生类中定义它?据我所知,没有。类型不是虚拟的。谢谢您的回答,但是,我如何才能向前声明旧的枚举?我需要forward声明,以便其他派生类可以随意定义E。