ホームページ >バックエンド開発 >C++ >ユーザー定義の変換でテンプレート引数の推定が失敗するのはなぜですか?

ユーザー定義の変換でテンプレート引数の推定が失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 16:20:29492ブラウズ

 Why Does Template Argument Deduction Fail with User-Defined Conversions?

テンプレート引数の推定とユーザー定義の変換

C テンプレート プログラミングの一般的なタスクは、ある型の値をテンプレートに渡すことです。異なる型の引数を期待するテンプレート関数。これを容易にするために、コンパイラは、実際の引数の型に基づいてテンプレート引数を自動的に推論できるテンプレート引数推論 (TAD) を提供します。

テンプレート引数推論の制限

ただし、TAD には制限があります。制限の 1 つは、ユーザー定義の変換が考慮されていないことです。これは、ある型から別の型へのユーザー定義の変換がある場合、TAD はその変換を適用してテンプレート引数を推論しないことを意味します。

ケーススタディ

検討してください次のコード スニペット:

<code class="cpp">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
}

このコードには、整数 a と何らかの型 Dtype の Scalar オブジェクトという 2 つの引数を取るテンプレート関数があります。 main 関数では、整数 a と整数 2 を渡して func を呼び出そうとします。ただし、これはコンパイル エラーで失敗します:

test.cpp: In function ‘int main()’:
test.cpp:32:12: error: no matching function for call to ‘func(int&, int)’
   func(a, 2);
            ^
test.cpp:32:12: note: candidate is:
test.cpp:25:6: note: template<class Dtype> void func(int, Scalar<Dtype>)
 void func(int a, Scalar<Dtype> b){
      ^
test.cpp:25:6: note:   template argument deduction/substitution failed:
test.cpp:32:12: note:   mismatched types ‘Scalar<Dtype>’ and ‘int’
   func(a, 2);</code>

Why TAD Fails

失敗の理由は、TAD が int から Scalar へのユーザー定義の変換を適用できないことです。これを機能させるには、呼び出し側で引数を明示的に変換するか、Scalar の演繹ガイドを定義する必要があります。

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

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