int i; // Здесь ошибка!

void swapargs(X &а, X &b)

{

 X temp;

 temp = a;

 a = b;

 b = temp;

}

Как отмечено в комментарии, template-спецификация должна стоять непосредственно перед определением функции. Между ними не может находиться ни инструкция объявления переменной, ни какая-либо другая инструкция.

Функция с двумя обобщенными типами

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

#include

using namespace std;

template

void myfunc(type1 x, type2 y)

{

 cout << x << ' ' << у << '\n';

}

int main()

{

 myfunc(10, "Привет");

 myfunc(0.23, 10L);

 return 0;

}

В этом примере при выполнении функции main(), когда компилятор генерирует конкретные экземпляры функции myfunc(), заполнители типов type1 и type2 заменяются сначала парой типов данных int и char*, а затем парой double и long соответственно.

Узелок на память.Создавая шаблонную функцию, вы, по сути, разрешаете компилятору генерировать столько различных версий этой функции, сколько необходимо для обработки различных способов, которые использует программа для ее вызова.

Явно заданная перегрузка обобщенной функции

"Вручную" перегруженная версия обобщенной функции называется явной специализацией.

Несмотря на то что обобщенная функция сама перегружается по мере необходимости, это можно делать и явным образом. Формально этот процесс называется явной специализацией. При перегрузке обобщенная функция переопределяется "в пользу" этой конкретной версии. Рассмотрим, например, следующую программу, которая представляет собой переработанную версию первого примера из этой главы.

// Перегрузка шаблонной функции.

#include

using namespace std;

template

void swapargs(X &a, X &b)

{

 X temp;

 temp = a;

 a = b;

 b = temp;

 cout << "Выполняется шаблонная функция swapargs.\n";

}

// Эта функция переопределяет обобщенную версию функции swapargs() для int-параметров.

void swapargs(int &а, int &b)

{

 int temp;

 temp = a;

 a = b;

 b = temp;

 cout << "Это int-специализация функции swapargs.\n";

}

int main()

{

 int i=10, j =20;

 double x=10.1, y=23.3;

 char a='x', b='z';

 cout << "Исходные значения i, j: " << i << ' '<< j << '\n';

 cout << "Исходные значения x, у: " << x << ' '<< у << '\n';

 cout << "Исходные значения a, b: " << a << ' '<< b << '\n';

 swapargs(i, j); // Вызывается явно перегруженная функция swapargs().

 swapargs(x, у); // Вызывается обобщенная функция swapargs().

 swapargs(a, b); // Вызывается обобщенная функция swapargs().

 cout << "После перестановки i, j: " << i << ' '<< j << '\n';

 cout << "После перестановки x, у: " << x << ' '<< у << '\n';

 cout << "После перестановки a, b: " << a << ' '<< b << '\n';

 return 0;

}

При выполнении эта программа генерирует такие результаты.

Исходные значения i, j: 10 20

Исходные значения х, у: 10.1 23.3

Исходные значения a, b: х z

Это int-специализация функции swapargs.

Выполняется шаблонная функция swapargs.

Выполняется шаблонная функция swapargs.

После перестановки i, j: 20 10

После перестановки х, у: 23.3 10.1

После перестановки а, b: z х

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги