でテンプレート化されたクラスがあります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
生成されますdouble
がint
、これらは同じではないため、控除は失敗します。
できることは、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
、通常の変換が行われます。
経験則として、テンプレート引数の演繹は を越えません::
。