推导出的模板似乎是错误的,为什么(c)被调用而不是(b)?
#include <iostream>
using namespace std;
template<class T> void f(T){cout << "f(T)";}//(a)
template<> void f<>(int*){cout << "f(int*)";}//(b)
template<class T> void f(T*){cout << "f(T*)";}//(c)
//void f(int*){cout <<"POD:f(int*)";}//(d)
int main(int argc,char*argv[])
{
int p = 1;
f(&p);
cout <<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
f(T*)
好吧,让我们先理清我们的情况。
(a) 是一个函数模板。(b) 是该函数模板的特化。(c) 是重载(a) 的另一个函数模板。
当您编写时,f(&p)需要考虑两个重载:两个函数模板(a)和(c)。(c)T*比 (a) 更专业T,因此选择 (c)。
现在让我们考虑注释掉的 (d)。这不是函数模板 (a) 的特化,而是额外的重载。为了解决该f(&p)调用,现在需要考虑三个重载。(d) 不是模板并且与int*的类型匹配&p,因此它会比其他两个模板被选中。