Если посмотреть внутри исходников популярных c библиотек типа Qt, то шаблонов там вы увидите очень много. И придется научится как минимум понимать чужие шаблоны (свои например нам еще не приходилось применять).
Шаблон или директива template используется как видно из названия для создания чего-то однотипного для разных сущностей.
Сущности это разные объекты в памяти: встроенные типы данных, классы, структуры,...
Что-то однотипное - это поведение этих объектов. Например это список этих объектов в памяти.
Контейнерные классы - хороший пример шаблонов (QList, QMap,...)
Принцип прост - один раз пишем шаблон и многократно используем его поведение (функционал) для разных сущностей.
Любой шаблон начинается со слова template. После ключевого слова template идут угловые скобки < >, в которых перечисляется список параметров шаблона. Каждому параметру должно предшествовать зарезервированное слово class или typename.
Ключевое слово typename говорит о том, что в шаблоне будет использоваться встроенный тип данных, такой как: int, double,float, charи т. д.
А ключевое слово class сообщает компилятору, что в шаблоне функции в качестве параметра будут использоваться пользовательские типы данных, то есть классы. Здесь будем говорить только о typename.
Процесс постижения шаблонов как оказывается лучше проводить на практике: у нас компилятор Windows msvc-2010 и исходники Qt 4.8.1.
Берем из исходников Qt яркого представителя шаблонов - контейнер QList- который начинается так:
template <typename T>
class QList
{
Замечаем что класс QList состоит и двух файлов qlist.h и qlist.cpp.
Первое - в файле qlist.cpp нет упоминания о параметре T
Второй момент - в конструкторах класса QList везде обязательно присутствует параметр с типом
Третий момент - все конструкторы объявлены и определены (реализованы) только в файле qlist.h
Четвертое - все переопределяемые операторы объявлены и реализованы в h файле (qlist.h).