问题描述
在下面的代码中,我们有两个类A
和B
,其中B
继承自A
。我们也有两个模板函数test(T &t)
和test(A &a)
。代码的输出为"A1"
为什么在这个例子中没有使用test(A &a)
函数?
// 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;
}
您试图将类型为A*
的值传递给接受A&
的函数。它们是不兼容的类型,指针不是引用。因此,不考虑专门化test(A&)
,而使用主模板,并将T
推导为A*
。
如果将调用test(a)
改为test(*a)
,则程序将打印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;
}
(现场演示)