#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
tofloat
иdouble
toint
одинаково плохи. Затем… запускается частичное упорядочение и решает, что второй является более специализированным, чем первый, так что вызывается один.2. @T.C. Хороший ответ!
3. @T.C. Спасибо за ваш ответ.
4. @songyuanyao Нет, реальный ответ объяснил бы, как именно работает этот частичный порядок. Но в правилах в этой области много недавних изменений (некоторые / большинство еще не реализованы ни в одном компиляторе), и мне не совсем хочется заниматься стандартной археологией.
5. @T.C. Да, фактическое правило может быть сложным; по-прежнему важно знать, что здесь вступает в силу правило частичного упорядочивания.