この原因は、2つの関数呼び出しのパラメーターリストの異なる位置に引数がある場合、関数のテンプレート引数控除が機能しないことです。最初の例では、キータイプはstd :: stringで、値タイプはintであるため、テンプレート引数控除はtがstd :: stringであり、uはintであることを正しく決定できます。2番目の例では、キータイプはintであり、値タイプはstd :: stringです。したがって、タイプが別の順序であるため、控除は失敗します。

これを修正するには、関数呼び出しのテンプレート引数を明示的に指定できます。

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

または、関数定義のテンプレートパラメーターの順序を再配置して、マップ内のタイプの順序に一致させることができます。

`` c ++
テンプレート<Typename T、TypeName U>
t getKey（const std :: map <t、u>＆m、const u＆value）{
// ...
}
`` `

この定義により、両方の関数への呼び出しは、明示的なテンプレート引数仕様なしで機能します。
The cause of this is that template argument deduction for functions does not work when the arguments are in different positions in the parameter list for the two function calls. In the first example, the key type is std::string and the value type is int, so the template argument deduction can correctly determine that T is std::string and U is int. In the second example, the key type is int and the value type is std::string, so the deduction fails because the types are in a different order.

To fix this, you can explicitly specify the template arguments for the function call:

```c++
int key2 = getkey<int, std::string>(map2, "apple");
```

Alternatively, you can rearrange the order of the template parameters in the function definition to match the order of the types in the map:

```c++
template<typename T, typename U>
T getkey(const std::map<T, U>& m, const U& value) {
// ...
}
```

With this definition, both calls to the function will work without explicit template argument specification.