ホームページ  >  記事  >  バックエンド開発  >  テンプレート引数の推論で暗黙的な型変換が失敗するのはなぜですか?

テンプレート引数の推論で暗黙的な型変換が失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 23:17:30857ブラウズ

Why Does Implicit Type Conversion Fail in Template Argument Deduction?

暗黙的な型変換とテンプレートの推論

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ただし、これによりコンパイル エラーが発生します。これはなぜですか?

エラーの理解

次の理由により、コンパイラはテンプレート引数の推論を実行できません:

  • 暗黙的な型変換が考慮されていないテンプレート引数の推論中。
  • int から Scalar への変換。はユーザー定義の変換であり、推論中にコンパイラによって認識されません。

解決策のオプション

この問題を解決するには、いくつかのアプローチを採用できます。 :

  • 呼び出し元サイトでの明示的な変換:
    呼び出し元サイトで引数を手動で変換します:

    <code class="cpp">func(a, Scalar<int>{2});</code>
  • 演繹ガイド (C 17 ):
    Scalar の演繹ガイドを定義し、func() を次のように呼び出します:

    <code class="cpp">func(a, Scalar{2});</code>
  • Explicitテンプレートのインスタンス化 (Scalar コンストラクターが明示的でない場合のみ):
    必要な型パラメーターの func() テンプレートを明示的にインスタンス化します:

    <code class="cpp">func<int>(a, 2); </code>

結論

C のテンプレート引数推定は強力なメカニズムですが、ユーザー定義の変換を処理する場合には制限があります。説明したソリューションを利用することで、開発者はテンプレート関数が意図した型パラメータで呼び出されることを保証できます。

以上がテンプレート引数の推論で暗黙的な型変換が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。