1

以下が可能かどうか疑問に思っています。次のようなコードがあるとします。

template <class NumberType>
struct Number
{
   NumberType value;

   void operator = (Number in_val)
   {
        value = in_val;
   }
}

それで、私は次のようなことができるでしょう:

Number<int> n1, n2;
n2.value = 5;
n1 = n2;
cout << "Value: " << n1.value << endl;

しかし、これでは次のことができません。

Number<int> n1;
Number<double> n2;
n2.value = 5;
n1 = n2;
cout << "Value: " << n1.value << endl;

これを可能にする方法は?この構造体/クラスを別のものでラップする必要がありますか、それとも派手な再帰を行う必要がありますか?

ps私はしばらくの間C++を使用しましたが、試したことはありませんtemplates。したがって、私はテンプレートに非常に慣れていないことを考慮してください。

-- 編集 -- わかりました。今は正しくわかりました。しかし、別の関連する質問が来ました。

template<class OtherNumType>
Number& operator *= ( const OtherNumType& in_value)
{
    value *= in_value;
    return *this;
}

これにより、コンパイル エラーが発生します。なんで?正しい方法は何ですか?

4

2 に答える 2

1

のテンプレート定義がNumber<T>コンパイラによって特定の type と見なされるとT、名前(型名として使用される場合) は、その時点で何であってもNumberとして解釈されます。Number<T>T

したがって、Number<int>現在のテンプレート定義では、以下の代入演算子のみが提供されます。

void operator=(Number<int> in_val)

その時点でNumber解釈されるからです。Number<int>

オペレーターをより柔軟にするために、メンバー テンプレート (既にテンプレート化されたクラスのテンプレート化された関数) に変換できます。

template <class NumberType>
struct Number
{
  NumberType value;

  template <typename T2>
  Number &operator=(const Number<T2> &in_val)
  {
    value = in_val.value;
    return *this;
  }
};

任意の typeNumber<T2>を受け入れるだけでなく、引数を const 参照として返して受け入れるように演算子を変更したことに注意してください。これは、代入演算子を定義する最も一般的で便利な方法です。 T2*this

于 2012-10-13T10:36:08.647 に答える
1

テンプレート operator= を提供できます

template<class OtherNumType>
Number<NumberType>& operator= ( const Number<OtherNumType>& in_val)
{
    value = in_val.value; // ok if the number types are implicitly convertable
    return *this;
}
于 2012-10-13T10:32:51.757 に答える