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




Определение шаблона функции - часть 4


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

// size определяет размер параметра-массива и инициализирует

// переменную типа const int

template <class Type, int size>

   Type min( const Type (&r_array)[size] )

{

   const int loc_size = size;

   Type loc_array[loc_size];

   // ...

}

Если в глобальной области видимости объявлен объект, функция или тип с тем же именем, что у параметра шаблона, то глобальное имя оказывается скрытым. В следующем примере тип переменной tmp не double, а тот, что у параметра шаблона Type:

typedef double Type;

template <class Type>

   Type min( Type a, Type b )

{

   // tmp имеет тот же тип, что параметр шаблона Type, а не заданный

   // глобальным typedef

   Type tm = a < b ? a : b;

   return tmp;

}

Объект или тип, объявленные внутри определения шаблона функции, не могут иметь то же имя, что и какой-то из параметров:

template <class Type>

   Type min( Type a, Type b )

{

   // ошибка: повторное объявление имени Type, совпадающего с именем

   // параметра шаблона

   typedef double Type;

   Type tmp = a < b ? a : b;

   return tmp;

}

Имя параметра-типа шаблона можно использовать для задания типа возвращаемого значения:

// правильно: T1 представляет тип значения, возвращаемого min(),

// а T2 и T3 – параметры-типы этой функции

template <class T1, class T2, class T3>

   T1 min( T2, T3 );

В одном списке параметров некоторое имя разрешается употреблять только один раз. Например, следующее определение будет помечено как ошибка компиляции:




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