Я почти только отредактировал пару дополнительных деталей в ответе KennyTM, но какого черта:
Для шаблона класса аргументы шаблона должны всегда указываться явно или предоставляться как аргументы шаблона по умолчанию.
Для шаблона функции аргументы шаблона обычно могут быть выведены автоматически, хотя иногда вам нужно (или хотите) указать их явно. Для одного довольно распространенного примера рассмотрим шаблон вроде:
template <class T>
void func(T const &a, T const &b) { }
Если вы вызываете это с аргументами двух разных типов (скажем, int и double), и каждый тип может неявно преобразовываться в другой, компилятор обычно не может решить, какой тип использовать. Вы можете исправить это, используя приведение для явного преобразования обоих аргументов в один и тот же тип, или явно указав аргументы шаблона:
func(1, 1.0); // ambiguous, T could be int or double
func((double)1, 1.0); // unambiguous
func<double>(1, 1.0); // also unambiguous