human
C ++で動作する自動テンプレート引数控除を取得しようとしています。2つの任意の型を入力としてSTD :: MAPを受け入れる関数を書き、最初のタイプの変数を出力として返します。次の例は、うまく機能し、コンパイルされています。
`` `
std :: map <std :: string、int> map1;
map1 ["apple"] = 1;
文字列key1 = getKey（Map1、1）;
`` `
以下は次のとおりです。
`` `
std :: map <int、std :: string> map2;
Map2 [1] = "Apple";
int key2 = getKey（map2、 "apple"）;
`` `
コンパイラは、マップで使用されるタイプを推測できないと言います。この原因は何ですか？
gpt
私はあなたの質問を手伝ってくれてうれしいです！コンパイラが2番目の例でマップで使用されているタイプを推測するのに苦労している理由は、マップ内のタイプの順序が最初の例から変更されたことです。最初の例では、キータイプはSTD ::文字列であり、値タイプはintです。ただし、2番目の例では、キータイプはintであり、値タイプはstd :: stringです。注文のこの違いは、コンパイラが関数呼び出しで使用する正しいタイプを決定するのに苦労することです。

この問題を解決するために、このような関数を呼び出すときにタイプを明示的に指定できます。

int key2 = getKey <int、std :: string>（map2、 "apple"）;

テンプレートの引数を明示的に提供することにより、マップのキーと値タイプに使用するタイプをコンパイラに伝え、関数呼び出しの正しいタイプを正常に推定できるようにします。
human
私は順序が異なることを知っている、私は例を書きました。あなたは私の質問に答えませんでした。自動テンプレート引数控除が最初の例ではなく、最初の例で機能するのはなぜですか？
gpt
C ++では、STD :: MAPは、キータイプと値タイプの2つのテンプレートパラメーターを取得するテンプレートクラスです。Map2と「Apple」を引数としてgetKey関数を呼び出すと、マップ2の重要なタイプがintであり、「Apple」はstd :: stringのタイプであるため、コンパイラはマップで使用されるタイプを推測することはできません。マップの重要なタイプとは一致しません。

この問題を修正するために、MAP2および「Apple」でそれを呼び出すときに、GetKey関数のテンプレート引数を明示的に指定できます。例えば：

        std :: map <int、std :: string> map2;
        Map2 [1] = "Apple";
        int key2 = getKey <int、std :: string>（map2、 "apple"）;

この場合、テンプレート引数<int、std :: string>は、getKey関数に対して明示的に指定されているため、コンパイラはマップとキー引数の正しいタイプを推定できます。

または、GetKey関数を変更して、最初の値がマップであり、2番目の値がキーである値のペアを受け入れることができます。このアプローチは、マップとキーのタイプが関数引数として明示的に指定されるため、テンプレート引数控除の必要性を完全に排除します。