I have created a simple function with 2 diffrernt template arguments t1, t2 and return type t3. So far no compilation error. But when Itry to call the function from main, I encounter error C2783. I needed to know If the following code is legally ok? If not how is it fixed? please help!
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;
}
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);
};
When attempting to deduce the template type, the compiler is not going to look at the actual code of the function. If you know the return type will be int
, then make it 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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With