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

C++ 在CRTP类中使用派生类型的成员,c++,templates,crtp,C++,Templates,Crtp,我有一个奇怪的循环模板模式类和一个派生类,如下所示: template<class Derived> class A { typedef typename Derived::C D; D x; }; class B : public A<B> { public: class C { }; }; 模板 甲级{ typedef typename派生::cd; dx; }; B类:公共A{ 公众: C类{}; }; 由于编译器试图定义D时B未完全定义,因此无法编

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

template<class Derived>
class A {
  typedef typename Derived::C D;
  D x;
};
class B : public A<B> {
public:
  class C { };
};
模板
甲级{
typedef typename派生::cd;
dx;
};
B类:公共A{
公众:
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:
};
模板
结构成员;
模板
甲级{
typedef typename成员::cd;
dx;
};
模板
结构成员{
C类{};
};
B类:公共A{
公众:
};

谢谢你的回答和很好的例子。我还认为一个
公众:
朋友是a类members
中需要code>才能真正允许
A
使用
C
@Dylan是的,我的意思是让
members
成为一个结构来获得公共访问权。