我有一个奇怪的重复模板模式类和派生类,如下所示:
template<class Derived>
class A {
typedef typename Derived::C D;
D x;
};
class B : public A<B> {
public:
class C { };
};
由于在编译器尝试定义D时未完全定义B,因此无法编译。如何实现类似的结果,即具有B中定义的类型的A成员?或者我是否必须强制C在B之外定义?
答案 0 :(得分:8)
或者我是否必须强制C在B之外定义?
是的,不幸的是你必须这样做。通常,您可以在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:
};