推定不可能なコンテキストにおけるテンプレート引数の推定に関する問題
このコード スニペットでは、テスト関数を使用しようとするとエラーが発生しますTMap
struct TMap { typedef std::map<T, T> Type; }; template<typename T> T test(typename TMap<T>::Type &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 を特定の T 型に特化させた場合、コンパイラは、次のような場合にどの特化を適用するかを決定できません。 std::map
この問題を解決するには、テスト関数を呼び出すときに T テンプレート引数を明示的に指定できます。
double d = test<double>(tmap);
テンプレート引数として double を指定すると、コンパイラはtmap_ の型を正しく推定し、それが TMap
以上が推論不可能なコンテキストで `std::map` を使用すると、テンプレート引数の推論が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。