This is an interview question, which has been done.
Which line has error ?
#include<iostream>
template<class T> void foo(T op1, T op2)
{
std::cout << "op1=" << op1 << std::endl;
std::cout << "op2=" << op2 << std::endl;
}
template<class T>
struct sum
{
static void foo(T op1, T op2)
{
std::cout << "sum=" << op2 << std::endl ;
}
};
int main()
{
foo(1,3); // line1
foo(1,3.2); // line2
foo<int>(1,3); // line3
foo<int>(1, '3') ; // line 4
sum::foo(1,2) ; // line 5 ,
return 0;
}
Line 2 has error because the template parameter is not matching the definition. Line 5 has error because the template parameter is missing.
But, Line 1 is an not an error, I do not know why, does not it also miss template parameter ?
Thanks !
It's called type deducition.
On Line 1, the type of T
can be deduced because parameters op1
and op2
are both int
, making T
an int
.
Whereas on Line 2, you are passing both an int and a double while the function accepts both parameters as T
, the compiler has no clue whether T
should be a double
or an int
.
Line 3 is fine because you specify int
specialization and pass int
s in as well (making the specialization redundant but perfectly OK).
Line 4 is OK because you declare T
to be an int, then casting the char
value of '3'
to its numeric int
value.
Line 5 is an error because you're accessing a function that gets its type from the templated struct it's in, and type deduction only works for functions.