Странная ошибка шаблона: ошибка C2783: не удалось вывести аргумент шаблона - PullRequest
2 голосов
/ 27 мая 2010

Я создал простую функцию с 2 различными аргументами шаблона t1, t2 и типом возврата t3. Пока что нет ошибки компиляции. Но при попытке вызвать функцию из main я сталкиваюсь с ошибкой C2783. Мне нужно было знать, если следующий код юридически в порядке? Если нет, то как это исправить? пожалуйста, помогите!

template <typename t1, typename t2, typename t3> 
t3 adder1 (t1  a , t2 b)
    {
        return int(a + b);
    };


int main()
{
       int sum = adder1(1,6.0);  // error C2783 could not deduce template argument for t3
       return 0;
}

Ответы [ 4 ]

10 голосов
/ 27 мая 2010

Компилятор не может вывести t3 из аргументов функции. Вы должны передать этот аргумент явно. Измените порядок параметров, чтобы сделать это возможным

template <typename t3, typename t1, typename t2> 
t3 adder1 (t1  a , t2 b)
    {
        return t3(a + b); // use t3 instead of fixed "int" here!
    };

Тогда вы можете позвонить с помощью adder1<int>(1, 6.0). Сложнее, если вы хотите вывести t3 к фактическому результату сложения. C ++ 0x (кодовое имя следующей версии C ++) позволит сделать это, сказав, что возвращаемый тип равен типу сложения следующим образом

template <typename t1, typename t2> 
auto adder1 (t1  a , t2 b) -> decltype(a+b)
    {
        return a + b;
    };

Тогда вы могли бы явно разыграть в точке использования

int sum = (int) adder1(1,6.0); // cast from double to int

Имитация этого в текущей версии C ++ не будет легкой. Вы можете использовать мой шаблон продвижения , чтобы сделать это. Если вы чувствуете, что это довольно запутанно для вас, и вы согласны с явным предоставлением возвращаемого типа, я думаю, что лучше остановиться на явном предоставлении этого. Как Херб Саттер говорит «Пиши, что знаешь, и знай, что пишешь»

Тем не менее, вы можете сделать выше, как это с этим шаблоном

template <typename t1, typename t2> 
typename promote<t1, t2>::type adder1 (t1 a, t2 b)
    {
        return (a + b);
    };
4 голосов
/ 27 мая 2010

При попытке определить тип шаблона компилятор не будет смотреть на фактический код функции. Если вы знаете, что тип возврата будет int, тогда сделайте его int.

template <typename t1, typename t2> 
int adder1 (t1  a , t2 b)
{
    return int(a + b);
};


int main()
{
   int sum = adder1(1,6.0);  // error C2783 could not deduce template argument for t3
   return 0;
}
0 голосов
/ 27 мая 2010

Вы всегда возвращаете int, следовательно, t3 не требуется. Вы можете изменить свой код как:

template <typename t1, typename t2> 
int adder1 (t1  a , t2 b)
    {
        return int(a + b);
    };


int main()
{

       int sum = adder1(1,6.0);  // error C2783 could not deduce template argument for t3
       return 0;

}
0 голосов
/ 27 мая 2010

В вашем случае единственным способом вызова вашей функции будет adder1<int, double, int>(...).

Вы можете сделать так, чтобы ваша функция возвращала явный аргумент t3 или передавал этот аргумент по ссылке, например

adder(const t1& a, const t2&b, t3& result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...