我有一个不完整的子类的CRTP缺少一个在基类中“没有真正”实现的方法:
#include <iostream>
using namespace std;
template<class T>
class BaseA
{
public:
T& asChild(){return static_cast<T&>(*this);}
void AMethod(void) {asChild().AMethod();}
};
class IncompleteChild : public BaseA<IncompleteChild>
{
public:
// uncomment the following to avoid segfault:
// void AMethod(void) {cout << "IncompleteChild Method" << endl;}
};
class Child : public BaseA<Child>
{
public:
void AMethod(void) {cout << "Child AMethod" << endl;}
};
template<class T>
void printBaseA(BaseA<T>& a)
{
a.AMethod();
}
int main()
{
IncompleteChild cI;
cI.AMethod();
printBaseA(cI);
return 0;
}
这编译得很好,但在运行时会导致分段错误。我怎么能避免这种情况?我更喜欢这里的编译器错误(使用gcc 4.6.3)。
答案 0 :(得分:6)
由于您的类实际上并不拥有成员AMethod
,因此您最终会调用CRTP基础的成员,从而为您提供无限递归。
简单的解决方案不是在整个地方重复使用名称,而是使用一个名为AMethod
而另一个AMethodImpl
或类似名称:
void AMethod()
{
static_cast<T*>(this)->AMethodImpl();
}