回答編集履歴

3

update

2017/10/24 04:13

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  ---
26
26
 
27
- 記事中でられている例:
27
+ 記事中で言及されているコード例:
28
28
 
29
29
 
30
30
 
@@ -85,3 +85,7 @@
85
85
  f( p ); // "b"を出力
86
86
 
87
87
  ```
88
+
89
+
90
+
91
+ 詳細は記事に譲りますが、関数の解決プロセスではテンプレート関数の完全特殊化は無視され、(プライマリテンプレートの)関数オーバーロードのみが考慮されるため、このような結果となるようです。

2

refine

2017/10/24 04:13

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -30,19 +30,19 @@
30
30
 
31
31
  ```C++
32
32
 
33
- template<class T>
33
+ template<class T> // (a) (プライマリ)テンプレート
34
34
 
35
35
  void f( T ) { std::puts("a"); }
36
36
 
37
37
 
38
38
 
39
- template<class T>
39
+ template<class T> // (b) 別のプライマリテンプレート, (a)のオーバーロード
40
40
 
41
41
  void f( T* ) { std::puts("b"); }
42
42
 
43
43
 
44
44
 
45
- template<>
45
+ template<> // (c) テンプレート(b)の完全特殊化
46
46
 
47
47
  void f<>(int*) { std::puts("c"); }
48
48
 
@@ -50,7 +50,7 @@
50
50
 
51
51
  int *p = nullptr;
52
52
 
53
- f( p ); // "c"を出力**
53
+ f( p ); // "c"を出力
54
54
 
55
55
  ```
56
56
 
@@ -62,19 +62,19 @@
62
62
 
63
63
  ```C++
64
64
 
65
- template<class T>
65
+ template<class T> // (a) (プライマリ)テンプレート
66
66
 
67
67
  void f( T ) { std::puts("a"); }
68
68
 
69
69
 
70
70
 
71
- template<>
71
+ template<> // (c) テンプレート(a)の完全特殊化
72
72
 
73
73
  void f<>(int*) { std::puts("c"); }
74
74
 
75
75
 
76
76
 
77
- template<class T>
77
+ template<class T> // (b) 別のプライマリテンプレート, (a)のオーバーロード
78
78
 
79
79
  void f( T* ) { std::puts("b"); }
80
80
 

1

update

2017/10/24 04:10

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -19,3 +19,69 @@
19
19
  > Summary
20
20
 
21
21
  > [...] For another thing, function template __specializations don't overload.__ This means that any specializations you write will not affect which template gets used, which runs counter to what most people would intuitively expect. After all, if you had written a nontemplate function with the identical signature instead of a function template specialization, the nontemplate function would always be selected because it's always considered to be a better match than a template. [...]
22
+
23
+
24
+
25
+ ---
26
+
27
+ 記事中で触れられている例:
28
+
29
+
30
+
31
+ ```C++
32
+
33
+ template<class T>
34
+
35
+ void f( T ) { std::puts("a"); }
36
+
37
+
38
+
39
+ template<class T>
40
+
41
+ void f( T* ) { std::puts("b"); }
42
+
43
+
44
+
45
+ template<>
46
+
47
+ void f<>(int*) { std::puts("c"); }
48
+
49
+
50
+
51
+ int *p = nullptr;
52
+
53
+ f( p ); // "c"を出力**
54
+
55
+ ```
56
+
57
+
58
+
59
+ b, c の定義順を入れ替えると...
60
+
61
+
62
+
63
+ ```C++
64
+
65
+ template<class T>
66
+
67
+ void f( T ) { std::puts("a"); }
68
+
69
+
70
+
71
+ template<>
72
+
73
+ void f<>(int*) { std::puts("c"); }
74
+
75
+
76
+
77
+ template<class T>
78
+
79
+ void f( T* ) { std::puts("b"); }
80
+
81
+
82
+
83
+ int *p = nullptr;
84
+
85
+ f( p ); // "b"を出力
86
+
87
+ ```