2011-01-26 7 views
1

私は初めてテンプレートクラスを扱い、継承を使用するときにコンパイラが好きではないように見える理由を理解しようとしています。C++継承されたテンプレートクラスは基本クラスにアクセスできない

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

    xPoint2() { x = 0; y = 0; }; 
}; 

template <typename T> 
struct xVector2 : xPoint2<T> 
{ 
    xVector2() { x = 0; y = 0; }; 
}; 

コンパイラの出力:

vector2.hh: In constructor ‘xVector2<T>::xVector2()’: 
vector2.hh:11: error: ‘x’ was not declared in this scope 
vector2.hh:11: error: ‘y’ was not declared in this scope 

が、このようにテンプレートを使用することはできませんここで

コードはありますか?あなたがthis->xthis->yを使用して、コンパイラを手助けする必要が

おかげ

+1

は、クラスのコンストラクタで初期化子ではなく、割り当てを使用することを検討してください。 – aschepler

+0

この場合、ベースクラスctorを呼び出すこともできます。 – Christoph

+0

@Christoph:より正確に言えば、あなたはいつもそのような呼び出しを書くかどうかにかかわらず、基本クラスの呼び出しを行います。だからこのコードでは、 'xVector2()'の代入は冗長です - それらはすでにベースコンストラクタによってゼロに設定されています。 – aschepler

答えて

4

あなたが明示的に親を参照する必要があります。

template <typename T> 
struct xVector2 : xPoint2<T> 
{ 
    typedef xPoint2<T> B; 
    xVector2() { B::x = 0; B::y = 0; }; 
}; 
関連する問題