В случае вызова функции компилятор определяет тип шаблона из типа аргумента. Например, функция std :: max . Компилятор использует тип аргументов для вывода параметра шаблона. Это не всегда работает, так как не все звонки однозначны.
int a = 5;
float b = 10;
double result1 = std::min( a, b ); // error: template parameter ambigous
double result2 = std::min< double >( a, b ); // explicit parameter enforces use of conversion
В случае шаблонного класса это не всегда возможно. Возьмите для примера этот класс:
template< class T>
class Foo {
public:
Foo();
void Bar( int a );
private:
T m_Member;
};
Тип T никогда не появляется ни в одном вызове функции, поэтому у компилятора нет никаких подсказок, какой тип следует использовать.