当我调整它们的顺序时,C++ 函数解析匹配不同的函数

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”的函数声明,为什么结果不同?

use*_*445 6

这里有两个(重载的)模板函数,第三个函数f(int*)专门用于模板函数之一。

特化发生在重载决策之后。因此,在这两种情况下,您都将选择f(T*)over f(T)。然而,在第一种情况下,当你有专业化时f(T*),你就会获得int*专业化。在第二种情况下,当您有专门化 时f(T),所选函数没有专门化。

请记住,您不能部分特化模板函数,只能完全特化它。如果您希望f始终打印int*,请考虑创建f(int*)常规函数,而不是模板专门化。