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

时间:2015-11-15 15:19:57

标签: 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;
    A *a = &b;
    a->foo();
}

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

编辑:我错误地认为这是有效的,但是,这不是真正的前向声明,而是两个不同的枚举类A :: E和B :: E

2 个答案:

答案 0 :(得分:1)

  

我想知道是否有更好的方法来做到这一点,所以每次我必须使用枚举时我都不必写E ::。

这与前瞻性声明无关。您必须撰写E::,因为您使用的是enum class 如果您不想这样做,请改用旧的enum

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

答案 1 :(得分:1)

目前还不完全清楚你要完成什么。 enum定义了一种类型,因此每次定义enum时都会定义一种新类型。这些类型与它们之间没有任何关系,而类似于它们之间存在关系的少数类型之一。

所以,如果你有以下两个类,

class A {

  public:

    enum class E {
      X,
      Y
    };

 };

class B : public A {

  public:

    enum class E {
      V,
      W
    };

 };

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