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

Dyl*_*lan 5 c++ templates crtp

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

template<class Derived>
class A {
  typedef typename Derived::C D;
  D x;
};
class B : public A<B> {
public:
  class C { };
};
Run Code Online (Sandbox Code Playgroud)

由于在编译器尝试定义D时未完全定义B,因此无法编译.如何实现类似的结果,即具有B中定义的类型的A成员?或者我是否必须强制C在B之外定义?

Pub*_*bby 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:
};
Run Code Online (Sandbox Code Playgroud)