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




Разрешение перегрузки при конкретизации * - часть 6


1.      Построить множество функций-кандидатов.

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

2.      Построить множество устоявших функций (см. раздел 9.3).

В множестве функций-кандидатов остаются только функции, которые можно вызвать с данными фактическими аргументами.

3.      Ранжировать преобразования типов (см. раздел 9.3).

a.   Если есть только одна функция, вызвать именно ее.

b.   Если вызов неоднозначен, удалить из множества устоявших функции, конкретизированные из шаблонов.

4.      Разрешить перегрузку, рассматривая среди всех устоявших только обычные функции (см. раздел 9.3).

a.   Если есть только одна функция, вызвать именно ее.

b.   В противном случае вызов неоднозначен.

Проиллюстрируем эти шаги на примере. Предположим, есть два объявления – шаблона функции и обычной функции. Оба принимают аргументы типа double:

template <class Type>

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

// обычная функция

double max( double, double );

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

int main() {

   int ival;

   double dval;

   float fd;

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

   max( 0, ival );

   max( 0.25, dval );

   max( 0, fd );

}

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

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

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




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