template шаблоны

Если посмотреть внутри исходников популярных 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() ).

Третий момент - все конструкторы объявлены и определены (реализованы) только в файле qlist.h

Четвертое - все переопределяемые операторы объявлены и реализованы в h файле (qlist.h).