Почему компилятор не разрешает этот вызов функции шаблона? - PullRequest
1 голос
/ 28 августа 2010

В программе ниже, почему компилятор генерирует ошибку для вызова функции шаблона printMax, а не для вызова функции printMaxInts?

#include <iostream>

template<class A>
void printMax(A a,A b)
{
   A c = a>b?a:b;

   std::cout<<c;
}

void printMaxInts(int a ,int b)
{
   int c = a>b?a:b;

   std::cout<<c;

}

int main()
{
   printMax(1,14.45);

   printMaxInts(1,24);
}

Ответы [ 2 ]

6 голосов
/ 28 августа 2010

Чтобы компилятор мог вывести параметр шаблона A из аргументов, переданных в шаблон функции, оба аргумента a и b должны иметь одинаковый тип.

Ваши аргументы имеют тип int и double, поэтому компилятор не может определить, какой тип он должен использовать для A. A должно быть int или double?

Это можно исправить, указав оба аргумента одного типа:

printMax(1.0, 14.45);

или явно указав параметр шаблона:

printMax<double>(1, 14.45);

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

void printMaxInts(int a, int b)

Оба a и b имеют тип int. Когда вы передаете double в качестве аргумента этой функции, стандартное преобразование double -> int выполняется для аргумента, и функция вызывается с полученным int.

1 голос
/ 28 августа 2010

Следующий код основан на ответе Джеймса.Вы заметите, что я вынул условное выражение: я сделал это, потому что результирующие предложения для этого выражения должны иметь один и тот же тип, что накладывает дополнительное ограничение на A и B.

ЕдинственноеТребования к A и B в этой версии кода заключаются в том, что существует оператор <(), который их связывает (или один может быть преобразован в другой), и что существуют необходимые функции оператора << (). </p>

template<typename A, typename B>
void printMax(A a, B b)
{    
    if (a < b) 
    {
        cout << b;
    }
    else 
    {
        cout << a;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...