Остальные ответы верны, но для полноты изложения я просто добавлю, что по своей природе C ++ может автоматически выводить аргументы шаблона , в некоторых случаях , и это не один из них.
Когда вы подумаете об этом, вы поймете, что автоматическое удержание в этом случае приведет к нежелательной ситуации. std::list<T>::iterator
не является реальным типом, это просто псевдоним typedef
для реального типа (например, это может быть T*
), на который он немедленно преобразуется, поэтому компилятору придется создавать некий «обратный индекс» чтобы отобразить T*
обратно на std::list<T>::iterator
для автоматического удержания T
, чтобы работать здесь. Но это отображение прервется, как только будет создан другой шаблон класса, который имеет элемент типа с именем iterator
, который был typedef
преобразован в T*
- тогда у компилятора будет два варианта, на что переводить T*
, и нет возможности выбирать между ними. Ясно, что любая политика автоматического вывода, которая нарушается, когда несвязанный класс добавляет конкретный член typedef
типа , слишком хрупок, чтобы работать.