我有一个奇怪的重复模板模式类和一个派生类,如下所示:
template<class Derived>
class A {
typedef typename Derived::C D;
D x;
};
class B : public A<B> {
public:
class C { };
};
当编译器尝试定义 D 时,由于 B 未完全定义,因此无法编译。我怎样才能获得类似的结果,即 A 的成员属于 B 中定义的类型?还是我必须强制在 B 之外定义 C?
还是我必须强制在 B 之外定义 C?
是的,不幸的是你必须这样做。通常您可以在之前定义一个模板类A
并将其专门用于B
,包含该C
类型。这允许您在A
.
template<typename T>
struct members;
template<class Derived>
class A {
typedef typename members<Derived>::C D;
D x;
};
template<>
struct members<class B> {
class C { };
};
class B : public A<B> {
public:
};