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




Вывод аргументов шаблона * - часть 3


template <class Type>

   class Array { /* ... */ }

template <class Type>

   Type min4( Array<Type>& array )

{

   Type min_val = array[0];

   for ( int i = 1; i < array.size(); ++i )

      if ( array[i] < min_val )

         min_val = array[i];

   return min_val;

}

min4() можно вызвать, передав в качестве первого аргумента ArrayRC<int>, как показано в следующем примере. (ArrayRC – это шаблон класса, также определенный в главе 2; наследование классов подробно рассматривается в главах 17 и 18.)

template <class Type>

   class ArrayRC : public Array<Type> { /* ... */ };

int main() {

   ArrayRC<int> ia_rc(10);

   min4( ia_rc );

}

Фактический аргумент ia_rc имеет тип ArrayRC<int>. Он не совпадает с типом формального параметра Array<Type>&. Но одним из базовых классов для ArrayRC<int> является Array<int>, так как он конкретизирован из шаблона класса, указанного в качестве формального параметра функции. Поскольку фактический аргумент является производным классом, то его можно использовать при выводе аргументов шаблона. Таким образом, перед выводом аргумент функции ArrayRC<int> преобразуется в тип Array<int>, после чего для аргумента шаблона Type выводится тип int и конкретизируется функция min4(Array<int>&).

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

template <class T> T min5( T, T ) { /* ... */ }

unsigned int ui;

int main() {

   // ошибка: нельзя конкретизировать min5( unsigned int, int )

   // должно быть: min5( unsigned int, unsigned int ) или

   //              min5( int, int )

   min5( ui, 1024 );

}

Оба фактических аргумента функции должны иметь один и тот же тип: либо int, либо unsigned int, поскольку в шаблоне они принадлежат к одному типу T. Аргумент шаблона T, выведенный из первого аргумента функции, – это int. Аргумент же шаблона T, выведенный из второго аргумента функции, – это unsigned int. Поскольку они оказались разными, процесс вывода завершается неудачей и при конкретизации шаблона выдается сообщение об ошибке. (Избежать ее можно, если явно задать аргументы шаблона при вызове функции min5(). В разделе 10.4 мы увидим, как это делается.)




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