为什么没有访问模板专门化函数



问题描述

在下面的代码中,我们有两个类AB,其中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;
}

(现场演示)

相关内容

  • 没有找到相关文章

最新更新