|
Программирование >> Инициализация объектов класса, структура
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 Предположим, что есть следующее множество определений и специализаций шаблонов, а
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |