回答編集履歴

1

2020/01/31 16:12

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -30,4 +30,66 @@
30
30
 
31
31
 
32
32
 
33
+ に書き換えることで一応動きますがここで注意があります。
34
+
35
+
36
+
37
+ この書き方の場合、`std::enable_if`による制約は**特殊化されたほうにも働きます**。
38
+
39
+
40
+
41
+ このため、上記の書き換え後の場合次のようなエラーが出るでしょう。
42
+
43
+
44
+
45
+ ```
46
+
47
+ prog.cc:7:17: error: non-type template argument specializes a template parameter with dependent type 'typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type'
48
+
49
+ struct Hoge<T*, nullptr> {
50
+
51
+ ^
52
+
53
+ prog.cc:2:96: note: template parameter is declared here
54
+
55
+ template<typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
56
+
57
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
58
+
59
+ prog.cc:2:46: error: failed requirement 'std::is_integral<int *>::value'; 'enable_if' cannot be used to disable this declaration
60
+
61
+ template<typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
62
+
63
+ ^~~~~~~~~~~~~~~~~~~~~~~~~~
64
+
65
+ prog.cc:11:39: note: while substituting prior template arguments into non-type template parameter [with T = int *]
66
+
67
+ static_assert(std::is_same_v<typename Hoge<int*>::type, int>);
68
+
33
- に書き換えてください
69
+ ^~~~~~~~~~
70
+
71
+ prog.cc:11:48: note: while checking a default template argument used here
72
+
73
+ static_assert(std::is_same_v<typename Hoge<int*>::type, int>);
74
+
75
+ ~~~~~~~~~^
76
+
77
+ prog.cc:11:51: error: expected a qualified name after 'typename'
78
+
79
+ static_assert(std::is_same_v<typename Hoge<int*>::type, int>);
80
+
81
+ ^
82
+
83
+ prog.cc:11:51: error: unknown type name 'type'
84
+
85
+ 4 errors generated.
86
+
87
+ ```
88
+
89
+
90
+
91
+ [https://wandbox.org/permlink/fOcgDM7bOiQlRgJR](https://wandbox.org/permlink/fOcgDM7bOiQlRgJR)
92
+
93
+
94
+
95
+ 今回やりたかったのはおそらく整数型へのポインタ型の場合の処理を書きたかったのだと思いますが、それならばChironianさんの書いたような書き方が必要になります。