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




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


// определение шаблона функции

template <class Type> Type sum( Type, int ) { /* ... */ }

// явная специализация для Type == double

template<> double sum<double>( double,int );

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

double sum( double, double );

void manip( int ii, double dd ) {

   // вызывается явная специализация шаблона sum<double>()

   sum( dd, ii );

}

При обращении к sum() внутри manip() в процессе вывода аргументов шаблона обнаруживается, что функция sum(double,int), конкретизированная из обобщенного шаблона, должна быть добавлена к множеству кандидатов. Но для нее имеется явная специализация, которая и становится кандидатом. На более поздних стадиях анализа выясняется, что эта специализация дает наилучшее соответствие фактическим аргументам вызова, так что разрешение перегрузки завершается в ее пользу.

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

// определение шаблона функции

template <class Type>

   Type min( Type, Type ) { /* ... */ }

// явная специализация для Type == double

template<> double min<double>( double, double );

void manip( int ii, double dd ) {

   // ошибка: вывод аргументов шаблона неудачен,

   // нет функций-кандидатов для данного вызова

   min( dd, ii );

}

Шаблон функции min() специализирован для аргумента double. Однако эта специализация не попадает в множество функций-кандидатов. Процесс вывода для вызова min() завершился неудачно, поскольку аргументы шаблона, выведенные для Type на основе разных фактических аргументов функции, оказались различными: для первого аргумента выводится тип double, а для второго – int. Поскольку вывести аргументы не удалось, в множество кандидатов никакая функция не добавляется, и специализация min(double, double) игнорируется. Так как других функций-кандидатов нет, вызов считается ошибочным.




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