我有一個測驗程式來查看編譯器(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;
}
它列印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;
}
它列印T*。兩個程式之間的唯一區別是我稍微更改了多載“f”的函式宣告,為什么結果不同?
uj5u.com熱心網友回復:
這里有兩個(多載的)模板函式,還有一個f(int*)專門用于模板函式之一的第三個函式。
特化發生在多載決議之后。因此,在這兩種情況下,您都將選擇f(T*)over f(T)。但是,在第一種情況下,當您擁有專業化時f(T*),您將獲得int*專業化。在第二種情況下,當您專門化時f(T),所選函式沒有專門化。
請記住,您不能部分特化模板函式,只能完全特化它。如果您想f始終列印int*,請考慮制作f(int*)常規功能,而不是模板專業化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496351.html
