奇怪的模板错误:错误C2783:无法推断模板参数

时间:2010-05-27 11:22:04

标签: c++ templates

我创建了一个带有2个diffrernt模板参数t1,t2和返回类型t3的简单函数。 到目前为止没有编译错误。但是当Itry从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 个答案:

答案 0 :(得分:10)

编译器无法从函数参数中推导出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 ++版本中模拟这并不容易。您可以使用我的promote template来执行此操作。如果您觉得这对您来说相当混乱,并且您可以明确地提供返回类型,我认为最好继续明确地提供它。像Herb Sutter says“写下你所知道的,知道你写的是什么”

尽管如此,你仍然可以使用该模板进行上述操作

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

答案 1 :(得分:4)

在尝试推断模板类型时,编译器不会查看函数的实际代码。如果您知道返回类型为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;
}

答案 2 :(得分:0)

在您的情况下,调用您的函数的唯一方法是adder1<int, double, int>(...)

你可以让你的函数返回一个显式的t3参数,或者通过引用传递这个参数,比如

adder(const t1& a, const t2&b, t3& result)

答案 3 :(得分:0)

您总是返回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;

}