teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

2020/01/31 16:12

投稿

yumetodo
yumetodo

スコア5852

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さんの書いたような書き方が必要になります。