在CRTP类中使用派生类型的成员

时间:2013-02-04 21:32:47

标签: c++ templates crtp

我有一个奇怪的重复模板模式类和派生类,如下所示:

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之外定义?

1 个答案:

答案 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:
};