2010-05-27 73 views
1

我创建了一个简单的函数,其中包含2个diffrernt模板参数t1,t2和返回类型t3。 到目前为止没有编译错误。但是当Itry从main调用该函数时,我遇到错误C2783。 我需要知道如果下面的代码合法吗?如果不是如何修复? 请帮忙!奇怪的模板错误:错误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; 
} 

回答

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“写你知道什么,并知道你写的什么?”

Nontheless您可以使用该模板

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

'std :: plus '任何人? :) +1 – 2010-05-27 11:32:03

+0

非常感谢您的答复 – osum 2010-05-30 17:30:37

0

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

你可以让你的函数由参考返回一个明确的说法t3或通过这样的说法,像

adder(const t1& a, const t2&b, t3& result) 
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; 

} 
3

当试图推断出模板类型,编译器是不会看函数的实际代码。如果您知道退货类型为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; 
}