質問編集履歴

2

2020/07/26 21:20

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -18,10 +18,6 @@
18
18
 
19
19
  しかしコンパイルエラーが発生しました。(エラー内容は下記参照)
20
20
 
21
- エラー文を見ると不完全な型を使うなと
22
-
23
- 言ってるようですがよくわからないです。
24
-
25
21
 
26
22
 
27
23
  どうすればよいのかしばらく調べてみて
@@ -32,67 +28,103 @@
32
28
 
33
29
  動くことが分かりましたが
34
30
 
35
- > なぜコード2ではエラーが発生し
31
+ **なぜコード2ではエラーが発生し
36
-
32
+
37
- コード3では問題なく動くの分かりません。
33
+ コード3では問題なく動くの分かりません。**
38
-
39
-
40
-
41
- ちなみに
34
+
42
-
35
+
36
+
43
- コード3ではテンプレートの特殊化を
37
+ どうか御回答よろしくお願い致します。
44
-
38
+
39
+
40
+
45
- 行っているようですが
41
+ ### コード1
46
42
 
47
43
  ```c++
48
44
 
45
+ //
46
+
47
+ // テンプレート引数に数値型以外入れることができない構造体Hoge
48
+
49
+ //
50
+
51
+ template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr>
52
+
53
+ struct Hoge{
54
+
55
+ Hoge()noexcept{
56
+
57
+ std::cout << "Hogeのコンストラクタ" << std::endl;
58
+
59
+ }
60
+
61
+ };
62
+
63
+
64
+
65
+ int main() {
66
+
49
- template<typename T> struct Hoge{};//Tにint以外が入力された場合の構造体Hoge
67
+ Hoge<int> hoge1;//数値型なのでコンパイルエラーは発生しない
50
-
68
+
51
- template<> struct Hoge<int>{};//Tにintが入力された場合みの構造体Hoge
69
+ //Hoge<int*> hoge2;//ポインタ型なでエラー発生
70
+
71
+
72
+
52
-
73
+ return 0;
74
+
75
+
76
+
77
+ }
78
+
53
- ```
79
+ ```
54
-
55
- 私はテンプレートの特殊化は上記コードのような
80
+
56
-
57
- 使い方しか知らないのでコード3のような特殊化は
58
-
59
- さっぱりわからないです。
60
-
61
-
62
-
63
- どうか御回答よろしくお願い致します。
64
-
65
-
66
-
67
- ### コード1
81
+ ### コード2
68
82
 
69
83
  ```c++
70
84
 
71
85
  //
72
86
 
73
- // テンプレート引数に数値型以外入れることができない構造体Hoge
87
+ // 構造体Hogeのメソッド(コンストラクタ)の定義と実装を分けるコード
88
+
74
-
89
+ // 注意:本コードはコンパイルエラーが発生します。
90
+
75
- //
91
+ //
92
+
93
+
94
+
95
+ #include <iostream>
96
+
97
+ #include <type_traits>
98
+
99
+ #include <memory>
100
+
101
+
76
102
 
77
103
  template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr>
78
104
 
79
105
  struct Hoge{
80
106
 
81
- Hoge()noexcept{
107
+ Hoge()noexcept;
82
-
83
- std::cout << "Hogeのコンストラクタ" << std::endl;
84
-
85
- }
86
108
 
87
109
  };
88
110
 
89
111
 
90
112
 
113
+ template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr>
114
+
115
+ Hoge<Type>::Hoge()noexcept{
116
+
117
+ std::cout << "Hogeのコンストラクタ" << std::endl;
118
+
119
+ }
120
+
121
+
122
+
91
123
  int main() {
92
124
 
93
- Hoge<int> hoge1;//数値型なのでコンパイルエラーは発生しない
125
+ Hoge<int> hoge1;
94
-
126
+
95
- //Hoge<int*> hoge2;//ポインタ型なのでエラー発生
127
+ //Hoge<int*> hoge2;
96
128
 
97
129
 
98
130
 
@@ -104,19 +136,15 @@
104
136
 
105
137
  ```
106
138
 
107
- ### コード2
139
+ ### コード3
108
140
 
109
141
  ```c++
110
142
 
111
143
  //
112
144
 
113
- // 構造体Hogeのメソッド(コンストラクタ)の定義と実装を分けるコード
114
-
115
- // 注意:本ードはコンパイルエラーが発生ます。
145
+ // コンパイルエラーもおかな挙動もないコード
116
-
146
+
117
- //
147
+ //
118
-
119
-
120
148
 
121
149
  #include <iostream>
122
150
 
@@ -128,7 +156,13 @@
128
156
 
129
157
  template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr>
130
158
 
131
- struct Hoge{
159
+ struct Hoge;
160
+
161
+
162
+
163
+ template <typename Type>
164
+
165
+ struct Hoge<Type>{
132
166
 
133
167
  Hoge()noexcept;
134
168
 
@@ -136,7 +170,7 @@
136
170
 
137
171
 
138
172
 
139
- template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr>
173
+ template <typename Type>
140
174
 
141
175
  Hoge<Type>::Hoge()noexcept{
142
176
 
@@ -148,9 +182,7 @@
148
182
 
149
183
  int main() {
150
184
 
151
- Hoge<int> hoge1;
185
+ Hoge<int> hoge;
152
-
153
- //Hoge<int*> hoge2;
154
186
 
155
187
 
156
188
 
@@ -160,64 +192,6 @@
160
192
 
161
193
  }
162
194
 
163
- ```
164
-
165
- ### コード3
166
-
167
- ```c++
168
-
169
- //
170
-
171
- // コンパイルエラーもおかしな挙動もないコード
172
-
173
- //
174
-
175
- #include <iostream>
176
-
177
- #include <type_traits>
178
-
179
- #include <memory>
180
-
181
-
182
-
183
- template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr>
184
-
185
- struct Hoge;
186
-
187
-
188
-
189
- template <typename Type>
190
-
191
- struct Hoge<Type>{
192
-
193
- Hoge()noexcept;
194
-
195
- };
196
-
197
-
198
-
199
- template <typename Type>
200
-
201
- Hoge<Type>::Hoge()noexcept{
202
-
203
- std::cout << "Hogeのコンストラクタ" << std::endl;
204
-
205
- }
206
-
207
-
208
-
209
- int main() {
210
-
211
- Hoge<int> hoge;
212
-
213
-
214
-
215
- return 0;
216
-
217
-
218
-
219
- }
220
-
221
195
 
222
196
 
223
197
  ```

1

不明点がよりわかりやすいように強調

2020/07/26 21:20

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -32,9 +32,9 @@
32
32
 
33
33
  動くことが分かりましたが
34
34
 
35
- **なぜコード2ではエラーが発生し
35
+ > なぜコード2ではエラーが発生し
36
-
36
+
37
- コード3では問題なく動くの分かりません**
37
+ コード3では問題なく動くの分かりません。
38
38
 
39
39
 
40
40