基础 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::E
和 B::E
是不同的类型。不管 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::E
和 B::E
是不同的类型。不管 class 层级如何,它们之间没有任何关系。