Как происходит разрешение перегрузки для двух разных методов шаблона?

#c #templates #overloading #overload-resolution

#c #шаблоны #перегрузка #перегрузка-разрешение

Вопрос:

Если у меня есть следующие шаблонные методы:

 template< typename T >
void function( T a )
{
    cout<<"Template T"<<endl;
}

template< typename T >
void function( int a )
{
    cout<<"Function taking Int"<<endl;
}
  

При вызове function< float >( 2.5 ) вызывается вторая функция outputing: Function taking Int .

Если я пытаюсь создать экземпляр функций для типа float, я получаю

функция void (float a );

И

функция void(int a);

Из которых первый, по-видимому, лучше подходит для типа double (аргумент 2.5 ), который я передаю.

Тогда почему программа выбирает второй метод?

Комментарии:

1. 2.5 является double . double to float и double to int одинаково плохи. Затем… запускается частичное упорядочение и решает, что второй является более специализированным, чем первый, так что вызывается один.

2. @T.C. Хороший ответ!

3. @T.C. Спасибо за ваш ответ.

4. @songyuanyao Нет, реальный ответ объяснил бы, как именно работает этот частичный порядок. Но в правилах в этой области много недавних изменений (некоторые / большинство еще не реализованы ни в одном компиляторе), и мне не совсем хочется заниматься стандартной археологией.

5. @T.C. Да, фактическое правило может быть сложным; по-прежнему важно знать, что здесь вступает в силу правило частичного упорядочивания.