Вместо
template <typename T>
void func(T arg) {/* something */}
почему мы не можем сделать
template <T>
void func(T arg) {/* something */}
От cplusplus.com:
Единственная разница между обоими прототипамииспользование либо класса ключевого слова, либо ключевого слова typename.Его использование нечеткое, поскольку оба выражения имеют одинаковое значение и ведут себя одинаково.
Мне это кажется ненужным образцом.