2011-01-27 8 views
3

私は、数学クラスのいくつかをテンプレートに変換して初期化リストを使用し、継承したクラスが初期化時に基本クラスのデータメンバーにアクセスする必要があるときに問題に遭遇しました。ここでC++継承されたテンプレートクラスと初期化リスト

はコードです:

template <typename T> 
struct xCoord2 
{ 
    T x; 
    T y; 

    xCoord2(T _x, T _y) : x(_x), y(_y) {}; 
}; 

template <typename T> 
struct xCoord3 : xCoord2<T> 
{ 
    typedef xCoord2<T> B; 

    T z; 

    // All Error 
    xCoord3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}; 
    xCoord3(T _x, T _y, T _z) : B::x(_x), B::y(_y), z(_z) {}; 
    xCoord3(T _x, T _y, T _z) : this->x(_x), this->y(_y), z(_z) {}; 

    // Works 
    xCoord3(T _x, T _y, T _z) { B::x = 0; B::y = 0; z = 0; }; 
}; 

は継承したクラスで初期化リストを使用することが可能ですか?

+1

'xCoord3'は本当に' xCoord2'ですか?または、特定のデータメンバーを共有するだけですか?これは、2つのクラスの間にis-a関係がない場合、継承が良い考えではない場合があります。 –

+0

この例は各クラスの一部にすぎませんが、継承は2つの型の間の数学を可能にするため、ここでは非常に便利です。 –

答えて

7

あなたは、基本クラスのコンストラクタを呼び出す必要があります。

xCoord3(T _x, T _y, T _z) : xCoord2(_x, _y), z(_z) { } 

これらは、非テンプレートクラスだった場合、これはまったく異なることないだろう:あなただけの派生クラスのコンストラクタで、派生クラスの基底クラスとメンバ変数を初期化することができます。