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
以前の回答による混乱をお詫びします。
自動テンプレート控除は、タイプが明示的に指定されているため、最初の例で動作します -  `key1`はタイプ` std :: string`であると宣言されています。
2番目の例は、文字列リテラル「Apple」のタイプが「const char*」であると想定されているため失敗します。これは、 `map2`のタイプ（` std :: string`）と競合するコンパイラに矛盾しています。

エラーは、テンプレートの引数を明示的に指定することで修正できます。
`` `
int key2 = getKey <int、std :: string>（map2、 "apple"）;
`` `
または、std :: stringリテラルサフィックスを使用して：
`` `
namespace std :: string_literalsを使用しています。
int key2 = getKey（map2、 "apple"）;
`` `