С++ для начинающих




.Пространства имен и шаблоны функций *


Как и любое другое глобальное определение, шаблон функции может быть помещен в пространство имен (см. обсуждение пространств имен в разделах 8.5 и 8.6). Мы получили бы ту же семантику, если бы определили шаблон в глобальной области видимости, скрыв его имя внутри пространства имен. При использовании вне этого пространства необходимо либо квалифицировать имя шаблона именем пространства имен, либо использовать using-объявление:

// ---- primer.h ----

namespace cplusplus_primer {

   // определение шаблона скрыто в пространстве имен

   template <class Type>

      Type min( Type* array, int size ) { /* ... */ }

}

// ---- user.C ----

#include <primer.h>

int ai[4] = { 12, 8, 73, 45 };

int main() {

   int size = sizeof(ai) / sizeof(ai[0]);

   // ошибка: функция min() не найдена

   min( &ai[0], size );

   using cplusplus_primer::min;  // using-объявление

   // правильно: относится к min() в пространстве имен cplusplus_primer

   min( &ai[0], size );

}

Что произойдет, если наша программа использует шаблон, определенный в пространстве имен, и мы хотим предоставить для него специализацию? (Явные специализации шаблонов рассматривались в разделе 10.6.) Допустим, мы хотим использовать шаблон min(), определенный в cplusplus_primer, для нахождения минимального значения в массиве объектов типа SmallInt. Однако мы осознаем, что имеющееся определение шаблона не вполне подходит, поскольку сравнение в нем выглядит так:

if ( array[i] < min_val )

В этой инструкции два объекта класса SmallInt сравниваются с помощью оператора <. Но этот оператор неприменим к объектам, если только не перегружен в классе SmallInt (мы покажем, как определять перегруженные операторы в главе 15). Предположим, что мы хотели бы определить специализацию шаблона min(), чтобы она пользовалась функцией compareLess() для сравнения двух подобных объектов. Вот ее объявление:

// функция сравнения объектов SmallInt

// возвращает true, если parm1 меньше parm2




Содержание  Назад  Вперед