Это не выводимый контекст.Вот почему аргумент шаблона не может быть выведен компилятором.
Только представьте, если бы вы могли специализировать TMap
следующим образом:
template <>
struct TMap<SomeType>
{
typedef std::map <double, double> Type;
};
Как компилятор может определить тип SomeType
, учитывая, что TMap<SomeType>::Type
равно std::map<double, double>
?Это не может. не гарантирует, что тип , который вы используете в std::map
, также тип в TMap
.Компилятор не может сделать это опасное предположение.Между аргументами type может не быть никакой связи.
Кроме того, у вас может быть другая специализация TMap
, определяемая как:
template <>
struct TMap<OtherType>
{
typedef std::map <double, double> Type;
};
Это делаетситуация еще хуже.Теперь у вас есть следующее:
TMap<SomeType>::Type
= std::map<double, double>
. TMap<OtherType>::Type
= std::map<double, double>
.
Теперь спросите себя: если TMap<T>::Type
равно std::map<double, double>
, как компилятор узнает, является ли T
SomeType
или OtherType
?Он даже не может знать , сколько таких вариантов у него есть, и при этом он не может знать вариантов самих себя ...
Я просто прошу вас ради размышлений-эксперимент (при условии, что он может знать полный набор вариантов ).