Imm*_*ant 5 c++ templates overloading overload-resolution
我有一个测试程序来查看编译器(g++)如何匹配模板函数:
#include<stdio.h>
template<class T>void f(T){printf("T\n");}
template<class T>void f(T*){printf("T*\n");}
template<> void f(int*){printf("int*\n");}
int main(int argc,char**) {
int *p = &argc;
f(p); // int*
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印int*. 看来专门的模板是高优先级匹配的?然后我稍微改变了函数声明,这次:
#include<stdio.h>
template<class T>void f(T){printf("T\n");}
template<> void f(int*){printf("int*\n");}
template<class T>void f(T*){printf("T*\n");}
int main(int argc,char**) {
int *p = &argc;
f(p); // T*
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印T*. 这两个程序之间的唯一区别是我稍微更改了重载“f”的函数声明,为什么结果不同?
这里有两个(重载的)模板函数,第三个函数f(int*)专门用于模板函数之一。
特化发生在重载决策之后。因此,在这两种情况下,您都将选择f(T*)over f(T)。然而,在第一种情况下,当你有专业化时f(T*),你就会获得int*专业化。在第二种情况下,当您有专门化 时f(T),所选函数没有专门化。
请记住,您不能部分特化模板函数,只能完全特化它。如果您希望f始终打印int*,请考虑创建f(int*)常规函数,而不是模板专门化。