テンプレート引数の推定と暗黙的な型変換
C では、テンプレート引数の推定は、テンプレート パラメータの型を自動的に決定する強力な機能です。呼び出し側の引数について。ただし、ユーザー定義の変換など、特定の種類の変換は推論中に考慮されません。
暗黙的な変換の問題
次のコード スニペットを考えてみましょう:
<code class="cpp">template<typename Dtype> class Scalar{ Scalar(Dtype v) : value_(v){} private: Dtype value_; };</code>
Scalar クラスは単純な値の型を表します。ここで、次のテンプレート関数について考えてみましょう。
<code class="cpp">template<typename Dtype> void func(int a, Scalar<Dtype> b){ cout << "ok" <<endl; }</code>
この関数は int と Scalar
次の main 関数では、int と int 値を指定して func を呼び出そうとしています:
<code class="cpp">int main(){ int a = 1; func(a, 2); // ERROR: template argument deduction fails return 0; }</code>
しかし、これによりコンパイル エラーが発生し、テンプレートが引数の演繹に失敗しました。これは、コンパイラが int 値 2 を Scalar
考えられる解決策
修正するにはこの問題では、いくつかのオプションがあります:
呼び出し元サイトでの明示的な変換:
<code class="cpp">func(a, Scalar<int>(2));</code>
これは、int 値を Scalar< に手動で変換します。 ;int>
演繹ガイド: (C 17 のみ)
スカラーの演繹ガイドを追加:
<code class="cpp">template<typename T> Scalar(T v) -> Scalar<T>;</code>
これは、呼び出し元の引数から Scalar の型を推定するときにこの推定ガイドを優先するようにコンパイラーに指示し、次のように func を呼び出すことができるようにします。
<code class="cpp">func(a, 2);</code>
明示的なインスタンス化:
特定の型の func を明示的にインスタンス化できます。
<code class="cpp">func<int>(a, 2);</code>
これにより、コンパイラは Dtype = int を使用して関数をインスタンス化し、テンプレート引数の推論の必要性を回避します。
以上がC の暗黙的な型変換でテンプレート引数推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。