1

基本クラスに「実際には」実装されていないメソッドが欠落している不完全な子クラスを持つこの 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 を使用)。

4

1 に答える 1

6

クラスには実際には member がないため CRTPAMethodベースのメンバーを呼び出すことになり、無限再帰が可能になります。

簡単な解決策は、名前をあちこちで再利用するのではなく、一方を呼び出して他方を呼び出すAMethodAMethodImpl またはそのようなものにすることです。

void AMethod()
{
    static_cast<T*>(this)->AMethodImpl();
}
于 2013-11-01T09:19:06.670 に答える