2013-11-01 42 views
1

我有這個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();} 
}; 

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)。

回答

6

由於你的班級實際上並沒有成員AMethod,你最終會調用CRTP基礎的成員,這會給你無限的遞歸。

簡單的解決方案是不重用這些名稱所有的地方,但有一個叫AMethod和其他AMethodImpl或類似的東西:

void AMethod() 
{ 
    static_cast<T*>(this)->AMethodImpl(); 
} 
+0

我首先想到這會很麻煩,因爲我不得不處理2套方法,但我錯了。調用子類AMethod確實會依次調用實現,並且基類可以具有默認實現。謝謝! – Christoph

相關問題