暗黙的な型変換とテンプレートの推論
C では、テンプレート引数の推論は、型パラメータに基づいて自動的に推論できるメカニズムです。関数の引数。ただし、テンプレート推定における暗黙的な型変換には制限があります。
次のコード スニペットを考えてみましょう:
<code class="cpp">#include<iostream> using namespace std; template<typename Dtype> class Scalar{ public: Scalar(Dtype v) : value_(v){} private: Dtype value_; }; template<typename Dtype> void func(int a, Scalar<Dtype> b){ cout << "ok" <<endl; } int main(){ int a = 1; func(a, 2); // error: no matching function for call to ‘func(int&, int)’ return 0; }
ここでの目標は、整数を使用して func() テンプレート関数を呼び出すことです。 a と暗黙的に変換された Scalar エラーの理解 次の理由により、コンパイラはテンプレート引数の推論を実行できません: 解決策のオプション この問題を解決するには、いくつかのアプローチを採用できます。 : 呼び出し元サイトでの明示的な変換: 演繹ガイド (C 17 ): Explicitテンプレートのインスタンス化 (Scalar 結論 C のテンプレート引数推定は強力なメカニズムですが、ユーザー定義の変換を処理する場合には制限があります。説明したソリューションを利用することで、開発者はテンプレート関数が意図した型パラメータで呼び出されることを保証できます。 以上がテンプレート引数の推論で暗黙的な型変換が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
呼び出し元サイトで引数を手動で変換します:<code class="cpp">func(a, Scalar<int>{2});</code>
Scalar の演繹ガイドを定義し、func() を次のように呼び出します:<code class="cpp">func(a, Scalar{2});</code>
必要な型パラメーターの func() テンプレートを明示的にインスタンス化します:<code class="cpp">func<int>(a, 2); </code>