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




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


Ключевое слово typename упрощает разбор определений шаблонов. (Мы лишь кратко остановимся на том, зачем оно понадобилось. Желающим узнать об этом подробнее рекомендуем обратиться к книге Страуструпа “Design and Evolution of C++”.)

При таком разборе компилятор должен отличать выражения-типы от тех, которые таковыми не являются; выявить это не всегда возможно. Например, если компилятор встречает в определении шаблона выражение Parm::name и если Parm – это параметр-тип, представляющий класс, то следует ли считать, что name представляет член-тип класса Parm?

template <class Parm, class U>

   Parm minus( Parm* array, U value )

{

   Parm::name * p;   // это объявление указателя или умножение?

                     // На самом деле умножение

}

Компилятор не знает, является ли name типом, поскольку определение класса, представленного параметром Parm, недоступно до момента конкретизации шаблона. Чтобы такое определение шаблона можно было разобрать, пользователь должен подсказать компилятору, какие выражения включают типы. Для этого служит ключевое слово typename. Например, если мы хотим, чтобы выражение Parm::name в шаблоне функции minus() было именем типа и, следовательно, вся строка трактовалась как объявление указателя, то нужно модифицировать текст следующим образом:

template <class Parm, class U>

   Parm minus( Parm* array, U value )

{

   typename Parm::name * p;   // теперь это объявление указателя

}

Ключевое слово typename используется также в списке параметров шаблона для указания того, что параметр является типом.

Шаблон функции можно объявлять как inline или extern – как и обычную функцию. Спецификатор помещается после списка параметров, а не перед словом template.

// правильно: спецификатор после списка параметров

template <typename Type>

   inline

   Type min( Type, Type );

// ошибка: спецификатор inline не на месте

inline

template <typename Type>

   Type min( Array<Type>, int );

Упражнение 10.1




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