Шаблоны классов (параметризованные классы) рассматриваются как описание множества классов, моделирующих абстрактные структуры данных и отличающихся типом полей, включенных в эту структуру. Шаблоны классов определяют правила построения каждого отдельного класса из множества разрешенных (допустимых) классов. Синтаксис описания шаблона класса выглядит так:
Template <список параметров шаблона>. <описание класса>

В списке параметров шаблона могут быть как параметры, определяющие тип, так и параметры, для которых этот тип фиксирован. Каждый формальный параметр, определяющий тип, обозначается ключевым словом class. Используя шаблоны, можно определить объекты класса. Формат определения объекта одного из классов, порождаемых шаблоном, выглядит так:

Имя_парметра_класса <список параметров шаблона>
Имя_объекта (параметры конструктора)

Пример 1
Template<class T, int, size>

Class queue
{
T *g;
Int sloc, rloc;

Public:
queue(void);
~queue(void);
void qput(T i);
T qget(void);
};

template<class T, int, size>

queue<T, size>::queue(void) /* объединение членов функции класса */
{
if(!(q=newT[size]))
{
cout<<”not enough memory”;
return;
}
sloc=rloc=0;
cout<< “Очередь размера ”<<size<<” инициализирована.”;
}

template<class T, int, size>
queue<T, size>::~queue(void)
{
delete q;
cout<<”очередь разр.”;
}

template<class T, int, size>
void queue<T, size>::qput(T, i)
{
if(sloc==size)
{
cout<<”очередь полна”;
return;
}
q[sloc++]=i;
}

template<class T, int, size>
Tqueue<T, size>::qget(void)
{
if(rloc==sloc)
{
cout<<”очередь пуста”;
}
return q[rloc++];
}

main()
{
queue<int , 5> a;
queue<double, 200> b;
/* объединение двух объектов класса queue массивами разных типов и размеров*/

a: qput(10);
b: qput(1.129);
a: qput(23);
b: qput (5.55);
cout<<a.qget()<<” “;
cout<<a.qget()<<” “;
cout<<b.qget()<<” “;
cout<<b.qget()<<”\n“;
const int s = 10;
queue<long double, s> *pq;
pq=new queue<long double, s>;
/* динамическое создание объекта. именно сейчас вызывается конструктор queue */

if(!pq)
{
cout<<”недостаток памяти\n”;
return 0;
}
else
cout << “объект создан\n”;

for(int i=0; i<s; i++)
pq -> qput(i/2.0+i); /* заполнение очереди */
for(i=0; i<s; i++) /* просмотр элементов */
cout << pq -> qget() << “ “;
cout<<”\n”;
delete pq;
return pq;
}
Достоинства и недостатки шаблонов классов.
Достоинства:
-мощное средство обращения с различными типами данных, которое называются параметрическим полиморфизмом
-обеспечивает безопасное использование различных типов данных в отличие от макросов препроцессора

Недостатки:
-программа, использующая шаблоны, содержит полный код каждого порожденного типа, что может увеличить размеры исполняемого файла
-шаблоны по разному работают с разными типами данных (следует использовать специализацию шаблонов)