Скачиваний:
46
Добавлен:
15.09.2014
Размер:
877.06 Кб
Скачать

Глава 12

Функции и целые классы могут быть объявлены друзьями не шаблон­ных классов. Для шаблонов классов также могут быть установлены отношения дружественности. Дружественность может быть установлена между шаблоном класса и глобальной функцией, функцией-элементом другого класса (возможно, шаблонного класса) или даже целым клас­сом (возможно, шаблонным классом).

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

Каждый шаблонный класс получает собственную копию статической функции-элемента шаблона класса.

Терминология

template<class T>

аргумент шаблона друзья шаблона имя шаблона имя шаблона класса ключевое слово class

в шаблонном параметре типа ключевое слово template нетиповой параметр заголовка

шаблона

объявление шаблона функции описание шаблона функции параметр типа в заголовке шаблона параметр шаблона параметризованный тип перегрузка шаблонной функции

статическая функция-член

шаблона класса статическая функция-член

шаблонного класса угловые скобки (< и >) формальный параметр

заголовка шаблона функция-член шаблонного класса член данных static шаблона класса член данных static шаблонного

класса

шаблон класса шаблон функции шаблонная функция шаблонный класс

Типичные ошибки программирования

  1. Ошибкой является отсутствие в шаблоне ключевого слова class перед каждым формальным параметром типа.

  2. Ошибка возникает, когда в списке параметров функции использу­ ются не все формальные параметры шаблона функции.

  3. Если шаблон вызывается с определяемым пользователем типом в качестве параметра и если этот шаблон использует операции (на­ пример, ==, +, <= и др.) с объектами этого типа, то такие операции должны быть перегружены! Если эти операции остались не пере­ груженными, то при редактировании связей будет выдано сообщение об ошибке, потому что компилятор, конечно, сгенерирует вызов со­ ответствующих перегруженных функций-операций, не обращая вни­ мание на то, что эти функции не определены.

  4. Компилятор подбирает вариант функции, соответствующий данному вызову. Если соответствующая функция не может быть найдена или

Шаблоны 699

если обнаружено несколько таких функций, то компилятор гене­рирует сообщение об ошибке.

12.5. В отличие от не шаблонных классов, которые могут быть вложен­ными, шаблоны классов не могут вкладываться друг в друга. По­пытка вложить один шаблон класса внутрь другого приводит к син­таксической ошибке.

Советы по повышению эффективности

  1. Шаблоны несомненно расширяют возможности многократного ис­ пользования программного кода. Но имейте в виду, что программа может создавать слишком много копий шаблонных функций и шаб­ лонных классов. Для этих копий могут потребоваться значительные ресурсы памяти.

  2. Если размер класса контейнера, например, массива или стека, может быть определен во время компиляции (например, при помощи нетипо­ вого параметра шаблона, указывающего размер), это устранит расходы на динамическое выделение памяти во время выполнения программы.

Замечания по технике программирования

  1. Шаблоны являются еще одной из многочисленных возможностей С++ по созданию более универсального программного обеспечения, которое можно использовать повторно.

  2. Шаблоны функций, как и макросы, позволяют создавать программ­ ное обеспечение, которое можно использовать повторно. Но в отли­ чие от макросов шаблоны функций в С++ позволяют полностью контролировать соответствие типов.

  3. Применение шаблонов классов увеличивает возможности повторного использования программного обеспечения, когда классы для конкрет­ ного типа данных могут создаваться на основе родовой версии класса.

  4. Определение размера класса контейнера во время компиляции (на­ пример, через нетиповой параметр шаблона) исключает возможность возникновения потенциально неисправимой ошибки во время вы­ полнения программы, если оператору new не удастся получить не­ обходимое количество памяти.

Упражнения для самопроверки

12.1. Определите, являются ли следующие утверждения истинными или ложными. Если утверждение ложно, объясните почему.

  1. Дружественная функция шаблона функции должна быть шаб­ лонной функцией.

  2. Если несколько шаблонных классов произведены от одного и того же шаблона класса с единственным статическим элементом данных, то каждый из шаблонных классов совместно использует одну копию этого статического элемента данных.