はい、C ++で「Apple」を書くだけで文字列が文字通りになります。

最初の例では、コンパイラはこの引数をSTD :: Stringに変換することを知っています。これは、MAP1が期待するタイプだからです。一方、2番目の例では、テンプレートのGetKey関数は2つのタイプを受信します。Map2のタイプからSTD :: STRINGと、指定したパラメーターから文字通りの文字列を受信し、何らかのヒントなしでそれらを変換する方法を知ることができません。
Yes, in C++ simply writing "apple" will give a string literal.

In your first example the compiler knows to convert this argument into an std::string, because that is the type that your map1 expects. Whereas in your second example your templated getkey function receives the two types, std::string from the type of map2 and the string literal from the parameter you gave, and is unable to know which way to convert them without some kind of a hint.