基础 class 中枚举的前向声明,派生 class 中的定义

forward declaration of enum in base class, definition in derived class

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

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();
}

这会起作用(编译器 gcc 4.8,编译命令:g++ -std=c++11 ...)但是我想知道是否有更好的方法来做到这一点,这样我就不必写 E:: 每次我必须使用枚举。

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

I was wondering if there is a better way to do this, so that I don't have to write E:: everytime I have to use the enum.

这与前向声明无关。你必须写 E::,因为你使用 enum class.
如果您不想这样,请改用旧 enum

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

还不完全清楚您要完成的任务。 enum 定义了一种类型,因此每次定义 enum 时,您都定义了一种新类型。这些类型之间没有关系,这与 classes 形成鲜明对比,后者是为数不多的在它们之间有关系的类型之一。

因此,如果您有以下两个 classes,

class A {

  public:

    enum class E {
      X,
      Y
    };

 };

class B : public A {

  public:

    enum class E {
      V,
      W
    };

 };

类型 A::EB::E 是不同的类型。不管 class 层级如何,它们之间没有任何关系。