所以,我试图在派生类中定义一个枚举,其中声明在基类中。它看起来像这样:
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
答案 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::E
和B::E
是不同的类型。无论类层次结构如何,它们之间都没有任何关系。