Программирование >>  Инициализация объектов класса, структура 

1 ... 165 166 167 [ 168 ] 169 170 171 ... 395


template <class Type>

Type max( Type, Type ) { ... }

обгчная функция

функции и обычной функции. Оба принимают аргументы типа double:

double max( double, double );

А вот три вызова miax (). Можете ли вы сказать, какая функция будет вызвана в каждом

int main() { int ival; double dval; float fd;

ival, dval и fd присваиваются значения

max( 0, ival ); max( 0.25, dval ); max( 0, fd );

случае?

Рассмотрим последовательно все три вызова:

1. miax(0,ival). Оба аргумента имеют тин int. Для вызова есть два кандидата: конкретизированная из шаблона функция max(int, int) и обычная функция max(double, double) . Конкретизированная функция точно соответствует фактическим аргументам, поэтому она и вызывается;

2. miax(0.25,double). Оба аргумента имеют тин double. Для вызова есть два кандидата: конкретизированная из шаблона max(double, double) и обычная max(double, double) . Вызов неоднозначен, поскольку точно соответствует обеим функциям. Правило 3b говорит, что в таком случае выбирается обычная функция;.

3. miax(0,fd). Аргументы имеют тин int и float соответственно. Для вызова существует только один кандидат: обычная функция max(double, double) . Вывод аргументов шаблона заканчивается неудачей, так как значения типа Type, выведенные из разных фактических аргументов функции, различны. Поэтому в множество кандидатов конкретизированная из шаблона функция не попадает. Обычная же функция устояла, поскольку существуют преобразования типов фактических аргументов в тин1 формальных параметров; она и выбирается. Если бы обычная функция не была объявлена, вызов закончился бы ошибкой.

А если бы м1 определили еще одну обгчную функцию для miax() ? Например:

b. В противном случае вызов неоднозначен. Проиллюстрируем эти шаги на примере. Предположим, есть два объявления - шаблона



template <class T> T max( T, T ) {

две обычные функции char max( char, char ) ;

double max( double, double );

int main() { float fd;

в пользу какой функции разрешается вызов?

max( 0, fd );

Будет ли в таком случае третий вызов разрешен по-другому? Да.

Правило 3b говорит, что, поскольку вызов неоднозначен, следует рассматривать только обычные функции. Ни одна из них не считается наилучшей из устоявших, так как преобразования типов фактических аргументов одинаково плохи: в обоих случаях для установления соответствия требуется стандартная трансформация. Таким образом, вызов неоднозначен, и компилятор сообщает об ошибке.

Упражнение 10.11

template <class Type> Type max( Type, Ty

Type ) {

Вернемся к представленному ранее примеру:

int main() { int ival; double dval;

float fd;

max( 0, ival ); max( 0.25, dval ); max( 0, fd );

double max( double, double );

Добавим в множество объявлений в глобальной области видимости следующую специализацию шаблона функции:

template <> char max<char>* char, char ) { ... }

Составьте список кандидатов и устоявших функций для каждого вызова max() внутри main() .

Предположим, что в main() добавлен следующий вызов:



int i; unsigned int

char str[24]; int ia[24];

template <class T> T calc( T* template <class T> T calc( T,

T*, int );

template<> chat calc( char*. int );

также объявления переменных и функций:

double calc( double, double );

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

(a) cslc( str, 24 ); (d) calc( i, ui );

(b) calc( is, 24 ); (e) calc( ia, ui );

устоявшие функции; объясните, какая из устоявших функций будет наилучшей.

(c) calc( ia[0], 1 ); (f) calc( &i, i );

10.9. Разрешение имен в определениях шаблонов А

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

template <typename Type> Type min( Type* array,

min( Type* array, int size )

Type min val = array[0]; for (int i = 1; i < size;

if ( array[i] < min val ) min val = array[i]; print( Inimum value found: ); print( min val );

return min val;

Главную роль играет наличие в конструкции формального параметра шаблона:

В функции min() типы переменных array и min val зависят от фактического типа, которым будет заменен Type при конкретизации шаблона, тогда как тип переменной

int main() { ...

max( 0, j );

В пользу какой функции он будет разрешен? Почему? Упражнение 10.12

Предположим, что есть следующее множество определений и специализаций шаблонов, а



1 ... 165 166 167 [ 168 ] 169 170 171 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика