一個函數模板即有特化版又有重載版,編譯器會選哪個?
以下代碼來自:為什么不要特化函數模版 的例3
代碼中的f(int*)調用有兩個選擇,一是特化版,另一個是重載版。
結果是編譯器選了重載版:Overload of base template.
(與我的期望相反,我并不想讓指針版為int*實例化,所以辛辛苦苦為int*作了特化,結果編譯器沒理我!)
原因是:編譯器是從所有的重載函數中選擇,而特化不是一個重載。
這時僅有兩個重載。當選中一個重載函數模板后,再在該模板的特化版本中選擇。
以下代碼來自:為什么不要特化函數模版 的例3
1 #include <iostream>
2
3 using namespace std;
4
5 template<class T>
6 void f(T)
7 {
8 cout << "Base template.\n";
9 }
10
11 template<>
12 void f(int*)
13 {
14 cout << "Explicit specialization.\n";
15 }
16
17 template<class T>
18 void f(T*)
19 {
20 cout << "Overload of base template.\n";
21 }
22
23 int main()
24 {
25 int * p;
26 f(p);
27
28 return 0;
29 }
30
2
3 using namespace std;
4
5 template<class T>
6 void f(T)
7 {
8 cout << "Base template.\n";
9 }
10
11 template<>
12 void f(int*)
13 {
14 cout << "Explicit specialization.\n";
15 }
16
17 template<class T>
18 void f(T*)
19 {
20 cout << "Overload of base template.\n";
21 }
22
23 int main()
24 {
25 int * p;
26 f(p);
27
28 return 0;
29 }
30
代碼中的f(int*)調用有兩個選擇,一是特化版,另一個是重載版。
結果是編譯器選了重載版:Overload of base template.
(與我的期望相反,我并不想讓指針版為int*實例化,所以辛辛苦苦為int*作了特化,結果編譯器沒理我!)
原因是:編譯器是從所有的重載函數中選擇,而特化不是一個重載。
這時僅有兩個重載。當選中一個重載函數模板后,再在該模板的特化版本中選擇。