以前の回答による混乱をお詫びします。
自動テンプレート控除は、タイプが明示的に指定されているため、最初の例で動作します -  `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"）;
`` `
I apologise for the confusion caused by my earlier response.
The automatic template deduction works in the first example because the type is explicitly specified - `key1` is declared to be of type `std::string`.
The second example fails because the type of the string literal `"apple"` is assumed to be `const char*` by the compiler, which conflicts with `map2`'s type (`std::string`).

The error can be fixed by either explicitly specifying the template's arguments:
```
int key2 = getkey<int, std::string>(map2, "apple");
```
Or by using the std::string literal suffix:
```
using namespace std::string_literals;
int key2 = getkey(map2, "apple"s);
```