2011-11-09 14 views
2

私はテンプレートパラメータで動作する演算子を定義するテンプレートクラスを持っています。 私はこのクラスから継承する別のクラスを持っており、演算子をもちろん継承したいと思います。C++テンプレートクラスの継承と演算子の使用

この考えてみましょう:私はタイプBのオブジェクトのための

例で宣言された事業者のいずれかを使用するように見えることはできません

template <typename T> 
class A 
{ 
public: 
    A(const T& x) : x_(x) {} 
    A operator-(const A& other) 
    { 
    A r(*this); 
    r.x_ -= other.x_; 
    return r; 
    } 

    T x() const { return x_; } 

private: 
    T x_; 
}; 

template <typename T> 
class B : public A<T> 
{ 
    // additional stuff here 
}; 

を:

int main() 
{ 
    // Fine 
    A<int> a(5); 
    A<int> b(2); 
    A<int> c = a - b; 
    std::cout << c.x() << std::endl; 

    // Won't compile :( 
    B<int> d(5); 
    B<int> e(2); 
    B<int> f = d - e; 
    std::cout << f.x() << std::endl; 

    return 0; 
} 

には、次のものがトリガされますエラー:エラー: 'A'から非スカラー型 'B'への変換が要求されました。

これはどのように機能しますか?私は本当にクラスBのすべてのコード(まったく同じ)を書き直さないようにしたい。

ありがとう!

答えて

3

問題は、演算子を呼び出すことではなく、Aの戻り値からBを構築することにあります。 Bは、その基底クラスA以外の任意のデータが含まれていない場合

、あなたはAからBのコンストラクタを提供することができます:独自のデータが含まれていない

template <typename T> 
class B : public A<T> 
{ 
public: 
    B(const T& x) : A<T>(x) {} 
    B(const A<T>&x) : A<T>(x) {} 
    // additional stuff here 
}; 

B場合は、きっとあなたが必要それらのデータフィールドを処理するためにoperator-を実装するには?私はこれをしようとすると

+0

私の場合、それはPointクラスなので、Aクラスはx、y Bクラスにはフラグ(uint32)が含まれています。私はあなたのソリューションはここで動作すると思います。私はあなたのソリューションをコンパイルすることはできません。 – zedxz

+1

@zedxz。謝罪。今度は 'A126 'というより' A 'を参照します。おそらくそれはコンパイルの問題でした。 – Keith

0

、Visual Studioはcannot convert from 'A<T>' to 'B<T>'

私にエラーを与えるだから私はA<int>B<int>から変数fの種類を変更しようと、それが適切にコンパイル。ここで私が持っているものだ。しかし

int main() 
{ 
    // Fine 
    A<int> a(5); 
    A<int> b(2); 
    A<int> c = a - b; 
    std::cout << c.x() << std::endl; 

    // does compile :) 
    B<int> d(5); 
    B<int> e(2); 
    A<int> f = d - e; 
    std::cout << f.x() << std::endl; 

    return 0; 
} 

、私はこれは、あなたがAにBからFをキャストする方法を見つけた場合は、Bに固有のデータメンバのすべてを見つけるだろうので、あなたは、何をしたいとは思いません消去されました。プロセッサがフードの中で何をしているのか考えるなら、これは理にかなっています。戻り値の型がoperator-であると判断すると、正確にsizeof(A)バイトのデータを返します。その上にある余分なデータ(Bに関連付けられたデータなど)は切り捨てられます。したがって、コンパイラは、返り値を型Bの変数に入れようとすると、あなたは運が悪いと伝えます。

関連する問題