ホームページ >バックエンド開発 >C++ >推論不可能なコンテキストで `std::map` を使用すると、テンプレート引数の推論が失敗するのはなぜですか?

推論不可能なコンテキストで `std::map` を使用すると、テンプレート引数の推論が失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-17 07:33:25912ブラウズ

Why Does Template Argument Deduction Fail with `std::map` in a Non-Deducible Context?

推定不可能なコンテキストにおけるテンプレート引数の推定に関する問題

このコード スニペットでは、テスト関数を使用しようとするとエラーが発生しますTMap を使用インスタンス:

struct TMap
{
    typedef std::map<T, T> Type;
};

template<typename T>
T test(typename TMap<T>::Type &amp;tmap_) { return 0.0; }

int main()
{
    TMap<double>::Type tmap;
    tmap[1.1] = 5.2;
    double d = test(tmap); // Error
}

このエラーは、コンパイラが関数の引数 tmap から T テンプレート引数を推定できないことが原因で発生します。この状況は、関数呼び出しの引数からテンプレート引数を推論できない、推論不可能なコンテキストにいるために発生します。

テンプレート ベースのプログラミングでは、コンパイラが自動的に関数呼び出しの引数からテンプレート引数を推測します。これは、テンプレート引数の推論として知られています。ただし、この場合、コンパイラは tmap_ に基づいて T を推定できません。これは、これが std::map のインスタンスであり、TMap::Type.

に直接関連付けられていないためです。 TMap を特定の T 型に特化させた場合、コンパイラは、次のような場合にどの特化を適用するかを決定できません。 std::map TMap の両方と組み合わせることができます。

この問題を解決するには、テスト関数を呼び出すときに T テンプレート引数を明示的に指定できます。

double d = test<double>(tmap);

テンプレート引数として double を指定すると、コンパイラはtmap_ の型を正しく推定し、それが TMap::Type に一致すると結論付けることができます。

以上が推論不可能なコンテキストで `std::map` を使用すると、テンプレート引数の推論が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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