There is no way for the compiler to deduce t3
from the function arguments. You need to pass this argument explicitly. Change the order of the parameters to make this possible
template <typename t3, typename t1, typename t2>
t3 adder1 (t1 a , t2 b)
{
return t3(a + b); // use t3 instead of fixed "int" here!
};
Then you can call it with adder1<int>(1, 6.0)
. It's more difficult if you want to deduce t3
to the actual result of the addition. C++0x (next C++ version's codename) will allow to do this by saying that the return type is equal to the type of the addition the following way
template <typename t1, typename t2>
auto adder1 (t1 a , t2 b) -> decltype(a+b)
{
return a + b;
};
Then you could cast explictly at the point of use
int sum = (int) adder1(1,6.0); // cast from double to int
Simulate this in the current C++ version isn't going to be easy. You can use my promote template to do that. If you feel that this rather confuses the matter for you and that you are OK with explictly providing the return type, i think it's better to stay with explicitly providing it. Like Herb Sutter says "Write What You Know, and Know What You Write"
Nontheless you can do the above like this with that template
template <typename t1, typename t2>
typename promote<t1, t2>::type adder1 (t1 a, t2 b)
{
return (a + b);
};