Problem Description
In the following code we have 2 classes A and B whereB inherits from A. We also have 2 template functions test(T &t) and test(A &a). The output of the code is "A1".
Why the test(A &a) function isn't being used in this example?
// Online C compiler to run C program online
#include <iostream>
class A {};
class B: public A {};
template<typename T>
void test(T &t){std::cout <<"A1";}
template<>
void test(A& a){std::cout <<"A2";}
// If we put test(A& a) before test(T &t) we get the compilation error
// 'test' is not a template function
int main() {
A *a = new B();
test(a);
delete a;
return 0;
}
CodePudding user response:
You're trying to pass a value of type A* to a function accepting A&. These are incompatible types, a pointer is not a reference. So the specialization test(A&) isn't considered, and the main template is used with T deduced as A*.
If we change the call test(a) to test(*a), then the program will print A2.
#include <iostream>
class A {};
class B: public A {};
template<typename T>
void test(T &t){std::cout <<"A1";}
template<>
void test(A& a){std::cout <<"A2";}
// If we put test(A& a) before test(T &t) we get the compilation error
// 'test' is not a template function
int main() {
A *a = new B();
test(*a); // <==== Here
delete a;
return 0;
}
