回答編集履歴
1
あ
answer
CHANGED
@@ -14,4 +14,35 @@
|
|
14
14
|
};
|
15
15
|
```
|
16
16
|
|
17
|
+
に書き換えることで一応動きますがここで注意があります。
|
18
|
+
|
19
|
+
この書き方の場合、`std::enable_if`による制約は**特殊化されたほうにも働きます**。
|
20
|
+
|
21
|
+
このため、上記の書き換え後の場合次のようなエラーが出るでしょう。
|
22
|
+
|
23
|
+
```
|
24
|
+
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'
|
25
|
+
struct Hoge<T*, nullptr> {
|
26
|
+
^
|
27
|
+
prog.cc:2:96: note: template parameter is declared here
|
28
|
+
template<typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
|
29
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
|
30
|
+
prog.cc:2:46: error: failed requirement 'std::is_integral<int *>::value'; 'enable_if' cannot be used to disable this declaration
|
31
|
+
template<typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
|
32
|
+
^~~~~~~~~~~~~~~~~~~~~~~~~~
|
33
|
+
prog.cc:11:39: note: while substituting prior template arguments into non-type template parameter [with T = int *]
|
34
|
+
static_assert(std::is_same_v<typename Hoge<int*>::type, int>);
|
17
|
-
|
35
|
+
^~~~~~~~~~
|
36
|
+
prog.cc:11:48: note: while checking a default template argument used here
|
37
|
+
static_assert(std::is_same_v<typename Hoge<int*>::type, int>);
|
38
|
+
~~~~~~~~~^
|
39
|
+
prog.cc:11:51: error: expected a qualified name after 'typename'
|
40
|
+
static_assert(std::is_same_v<typename Hoge<int*>::type, int>);
|
41
|
+
^
|
42
|
+
prog.cc:11:51: error: unknown type name 'type'
|
43
|
+
4 errors generated.
|
44
|
+
```
|
45
|
+
|
46
|
+
[https://wandbox.org/permlink/fOcgDM7bOiQlRgJR](https://wandbox.org/permlink/fOcgDM7bOiQlRgJR)
|
47
|
+
|
48
|
+
今回やりたかったのはおそらく整数型へのポインタ型の場合の処理を書きたかったのだと思いますが、それならばChironianさんの書いたような書き方が必要になります。
|