That is non-deducible context. That is why the template argument cannot be deduced by the compiler.
Just imagine if you might have specialized TMap
as follows:
template <>
struct TMap<SomeType>
{
typedef std::map <double, double> Type;
};
How would the compiler deduce the type SomeType
, given that TMap<SomeType>::Type
is std::map<double, double>
? It cannot. It's not guaranteed that the type which you use in std::map
is also the type in TMap
. The compiler cannot make this dangerous assumption. There may not any relation between the type arguments, whatsoever.
Also, you might have another specialization of TMap
defined as:
template <>
struct TMap<OtherType>
{
typedef std::map <double, double> Type;
};
This makes the situation even worse. Now you've the following:
TMap<SomeType>::Type
= std::map<double, double>
.
TMap<OtherType>::Type
= std::map<double, double>
.
Now ask yourself: given TMap<T>::Type
is std::map<double, double>
, how would the compiler know whether T
is SomeType
or OtherType
? It cannot even know how many such choices it has, neither can it know the choices themselves...
I'm just asking you for the sake of thought-experiment (assuming it can know the complete set of choices).
Tmap<T>::Type
is the most commonly known example of a non-deduced context. The linked Q&A explains this particular case in a lot of detail. – Feaster