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
成为一个结构来获得公共访问权。