テンプレート関数が 'T' = 'double' のときに 'int' を 'T' に昇格しないのはなぜですか? 質問する

テンプレート関数が 'T' = 'double' のときに 'int' を 'T' に昇格しないのはなぜですか? 質問する

でテンプレート化されたクラスがありますtypename T。このクラスには関数が含まれています。

template <typename T, size_t a>
myClass<T,a> operator+(myClass<T,a> lhs, const T& rhs) {
    return lhs += rhs;
}

myClass<T,a> myClass<T,a>::operator+=(const T& rhs) {
    // Do addition, depends on 'a'.
    return *this;
}

これを例えば

myClass<double, 2> myObj_double_2(constructor args);
myObj_double_2 = myObj_double_2 + 5.2;

問題ないです。

しかし、私が電話すると

myObj_double_2 = myObj_double_2 + 5;

すると、コンパイラは次のようなメッセージを表示しますNo match for 'operator+' (operand types are 'myClass<double, 2ul>' and 'int'). Candidates are ... note: deduced conflicting types for parameter 'const T' ('double' and 'int')

何らかの方法で、変換される追加の型を渡すことができるようにコードを記述できますかT(たとえば、double(5) は有効なコンストラクター呼び出しであるため)?

ベストアンサー1

テンプレート引数の推論を使用する場合、1つのテンプレートパラメータのすべての推論には、同じ結果。

あなたの場合、 の 2 つの控除により と がT生成されますdoubleint、これらは同じではないため、控除は失敗します。

できることは、1つテンプレート引数の推論のための関数引数を作成し、もう1つを作成します推測できない:

template <typename T, std::size_t A>
void foo(myClass<T, A> arg1, typename std::common_type<T>::type arg2);
//                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

std::common_type<T>::type本質的に であることに注意してくださいT。しかし、 の型はarg2依存型(その名前が の右側に表示される::)であるため、推論されません。したがって、最初の引数のみが推論に参加し、T = double明確に が生成され、2 番目の関数パラメータは 型になりdouble、通常の変換が行われます。

経験則として、テンプレート引数の演繹は を越えません::

おすすめ記事