C++ CRTP编译,但I';我不希望这样。怎样

C++ CRTP编译,但I';我不希望这样。怎样,c++,crtp,C++,Crtp,我有一个CRTP,它有一个不完整的子类,缺少一个在基类中“不是真正”实现的方法: #include <iostream> using namespace std; template<class T> class BaseA { public: T& asChild(){return static_cast<T&>(*this);} void AMethod(void) {asChild().AMethod();} }; cla

我有一个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;
}
#包括
使用名称空间std;
样板
基类
{
公众:
T&asChild(){return static_cast(*this);}
void-AMethod(void){asChild().AMethod();}
};
类未完成子类:公共BaseA
{
公众:
//取消注释以下内容以避免segfault:

//void-AMethod(void){cout由于您的类实际上没有成员
AMethod
,因此您最终会调用CRTP基的成员,这将提供无限递归

简单的解决方案不是到处重复使用名称,而是使用一个名为
AMethod
的名称和另一个名为
AMethodImpl
的名称或类似的名称:

void AMethod()
{
    static_cast<T*>(this)->AMethodImpl();
}
void-AMethod()
{
静态_cast(this)->AMethodImpl();
}

由于您的类实际上没有成员
AMethod
,因此您最终会调用CRTP基的成员,这将为您提供无限递归

简单的解决方案不是到处重复使用名称,而是使用一个名为
AMethod
的名称和另一个名为
AMethodImpl
的名称或类似的名称:

void AMethod()
{
    static_cast<T*>(this)->AMethodImpl();
}
void-AMethod()
{
静态_cast(this)->AMethodImpl();
}

我首先认为这会很麻烦,因为我必须处理两组方法,但我错了。调用子类AMethod确实会依次调用实现,基类可以有一个默认实现。谢谢!我首先认为这会很麻烦,因为我必须处理两组方法,但我认为错误。调用子类AMethod确实会依次调用实现,基类可以有一个默认实现。谢谢!