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

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

Barbara Streisand
リリース: 2024-10-28 07:05:02
オリジナル
686 人が閲覧しました

Why Does Template Argument Deduction Fail with Implicit Type Conversions in C  ?

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

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 に自動的に変換できないためです。物体。 Scalar::Scalar(Dtype value) などのユーザー定義の変換は、テンプレート引数の推論中に考慮されません。

考えられる解決策

修正するにはこの問題では、いくつかのオプションがあります:

  • 呼び出し元サイトでの明示的な変換:

    <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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート