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

最初の例の角度ブラケットのように、または2番目の入力パラメーターが2番目の例のマップ値と同じタイプネームを持っているように？
So, for clarity, am I correct to assume that the root of the problem is that the compiler won't know that "apple" is an std::string without being provided some kind of a hint?

Like in the angle brackets in your first example, or that the second input parameter will have the same typename as the map value in your second example?