したがって、明確にするために、問題の根本は、「Apple」が何らかのヒントを提供されることなくSTD ::文字列であることをコンパイラが知らないことを想定するのが正しいですか？

最初の例の角度ブラケットのように、または2番目の入力パラメーターが2番目の例のマップ値と同じタイプネームを持っているように？
はい、C ++で「Apple」を書くだけで文字列が文字通りになります。

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