質問編集履歴

7

誤記修正

2020/08/09 22:10

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 移譲コンストラクタで親クラスのメンバ変数(参照)を初期化できない
1
+ 親クラスのメンバ変数(参照)を初期化できない
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- を所持し、移譲コンストラクタでそれら変数を初期化する
13
+ を所持し、引数付きコンストラクタでそれら変数を初期化する
14
14
 
15
15
  イテレータを作成しようとしたコードです。
16
16
 
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- しかし派生クラスの移譲コンストラクタでコンパイルエラーが発生します。
37
+ しかし派生クラスの引数付きコンストラクタでコンパイルエラーが発生します。
38
38
 
39
39
 
40
40
 

6

細かい点修正

2020/08/09 22:09

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- **どのように書けばメンバ変数element_を初期化できるのでしょうか**
49
+ **どのように書けばメンバ変数element_をコンストラクタの引数で初期化できるのでしょうか**
50
50
 
51
51
 
52
52
 

5

わかりやすくなるよう修正

2020/08/09 04:11

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -40,13 +40,13 @@
40
40
 
41
41
  エラー文(下記記載)を読む限りだと
42
42
 
43
- 派生クラスのコンストラクタでメンバ変数(参照)を操作できないと言っているようですが
43
+ 派生クラスのコンストラクタでメンバ変数element_(参照)を操作できないと言っているようですが
44
44
 
45
45
  対処法がわかりません。
46
46
 
47
47
 
48
48
 
49
- **どのように書けばメンバ変数を初期化できるのでしょうか**
49
+ **どのように書けばメンバ変数element_を初期化できるのでしょうか**
50
50
 
51
51
 
52
52
 

4

細かい部分修正

2020/08/09 04:09

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- **どのように書けばパイルエラー抑えることができるのでしょうか**
49
+ **どのように書けばバ変数初期化できるのでしょうか**
50
50
 
51
51
 
52
52
 

3

いらないヘッダー削除

2020/08/09 04:07

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -58,8 +58,6 @@
58
58
 
59
59
  #include <iostream>
60
60
 
61
- #include <type_traits>
62
-
63
61
  #include <memory>
64
62
 
65
63
  #include <cassert>

2

誤字修正

2020/08/09 01:22

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 譲コンストラクタで親クラスのメンバ変数(参照)を初期化できない
1
+ 譲コンストラクタで親クラスのメンバ変数(参照)を初期化できない
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- を所持し、譲コンストラクタでそれら変数を初期化する
13
+ を所持し、譲コンストラクタでそれら変数を初期化する
14
14
 
15
15
  イテレータを作成しようとしたコードです。
16
16
 
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- しかし派生クラスの譲コンストラクタでコンパイルエラーが発生します。
37
+ しかし派生クラスの譲コンストラクタでコンパイルエラーが発生します。
38
38
 
39
39
 
40
40
 

1

エラー発生部分をわかりやすくなるよう修正

2020/08/09 01:16

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -192,8 +192,12 @@
192
192
 
193
193
  struct Iterator final:public BaseIterator<Type, SizeType>{
194
194
 
195
+ //↓ここでコンパイルエラー発生
196
+
195
197
  Iterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}
196
198
 
199
+
200
+
197
201
  Iterator()noexcept = delete;
198
202
 
199
203
  ~Iterator() = default;
@@ -234,126 +238,130 @@
234
238
 
235
239
  struct ConstIterator final:public BaseIterator<Type, SizeType>{
236
240
 
241
+ //↓ここでコンパイルエラー発生
242
+
243
+ ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}
244
+
245
+
246
+
247
+ ConstIterator()noexcept = delete;
248
+
249
+ ~ConstIterator() = default;
250
+
251
+
252
+
253
+ // カウンタの指す要素のコピーを返す
254
+
255
+ auto operator*()const {return this->element_[this->counter_];}
256
+
257
+
258
+
259
+ // 指定した要素のコピーを返す
260
+
261
+ auto operator[](const SizeType size)const {
262
+
263
+ assert(size <= this->size_);
264
+
265
+ return this->element_[size];
266
+
267
+ }
268
+
269
+ };
270
+
271
+
272
+
273
+ ///////////////
274
+
275
+ //
276
+
277
+ // main関数
278
+
279
+ //
280
+
281
+ //////////////
282
+
283
+ int main(){
284
+
285
+
286
+
287
+ auto size = size_t(5);
288
+
289
+ auto mem = std::make_unique<int[]>(size);
290
+
291
+
292
+
293
+ auto itr = ConstIterator(mem, size);
294
+
295
+
296
+
297
+ return 0;
298
+
299
+ }
300
+
301
+
302
+
303
+ ```
304
+
305
+ ### エラー文
306
+
307
+ ```terminal
308
+
309
+ [コードのパス]/main.cpp:90:88: error: typename specifier refers to non-type member 'element_' in 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
310
+
237
311
  ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
238
312
 
239
- ConstIterator()noexcept = delete;
240
-
241
- ~ConstIterator() = default;
242
-
243
-
244
-
245
- // カウンタの指す要素のコピーを返す
246
-
247
- auto operator*()const {return this->element_[this->counter_];}
248
-
249
-
250
-
251
- // 指定した要素のコピーを返す
252
-
253
- auto operator[](const SizeType size)const {
254
-
255
- assert(size <= this->size_);
313
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
256
-
257
- return this->element_[size];
314
+
258
-
259
- }
260
-
261
- };
262
-
263
-
264
-
265
- ///////////////
315
+ [コードのパス]/main.cpp:114:16: note: in instantiation of member function 'ConstIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>::ConstIterator' requested here
266
-
267
- //
268
-
269
- // main関数
270
-
271
- //
272
-
273
- //////////////
274
-
275
- int main(){
276
-
277
-
278
-
279
- auto size = size_t(5);
280
-
281
- auto mem = std::make_unique<int[]>(size);
282
-
283
-
284
316
 
285
317
  auto itr = ConstIterator(mem, size);
286
318
 
287
-
288
-
289
- return 0;
290
-
291
- }
319
+ ^
320
+
321
+ [コードのパス]/main.cpp:14:15: note: referenced member 'element_' is declared here
322
+
323
+ Type& element_;// 配列の参照
324
+
325
+ ^
326
+
327
+ [コードのパス]/main.cpp:90:88: error: 'element_' is a protected member of 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
328
+
329
+ ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
330
+
331
+ ^
332
+
333
+ [コードのパス]/main.cpp:14:15: note: must name member using the type of the current context 'ConstIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
334
+
335
+ Type& element_;// 配列の参照
336
+
337
+ ^
338
+
339
+ [コードのパス]/main.cpp:90:136: error: typename specifier refers to non-type member 'size_' in 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
340
+
341
+ ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
342
+
343
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
344
+
345
+ [コードのパス]/main.cpp:15:19: note: referenced member 'size_' is declared here
346
+
347
+ SizeType& size_;// サイズの参照
348
+
349
+ ^
350
+
351
+ [コードのパス]/main.cpp:90:136: error: 'size_' is a protected member of 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
352
+
353
+ ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
354
+
355
+ ^
356
+
357
+ [コードのパス]/main.cpp:15:19: note: must name member using the type of the current context 'ConstIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
358
+
359
+ SizeType& size_;// サイズの参照
292
360
 
293
361
 
294
362
 
295
363
  ```
296
364
 
297
- ### エラー文
298
-
299
- ```terminal
300
-
301
- [コードのパス]/main.cpp:90:88: error: typename specifier refers to non-type member 'element_' in 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
302
-
303
- ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
304
-
305
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
306
-
307
- [コードのパス]/main.cpp:114:16: note: in instantiation of member function 'ConstIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>::ConstIterator' requested here
308
-
309
- auto itr = ConstIterator(mem, size);
310
-
311
- ^
312
-
313
- [コードのパス]/main.cpp:14:15: note: referenced member 'element_' is declared here
314
-
315
- Type& element_;// 配列の参照
316
-
317
- ^
318
-
319
- [コードのパス]/main.cpp:90:88: error: 'element_' is a protected member of 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
320
-
321
- ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
322
-
323
- ^
324
-
325
- [コードのパス]/main.cpp:14:15: note: must name member using the type of the current context 'ConstIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
326
-
327
- Type& element_;// 配列の参照
328
-
329
- ^
330
-
331
- [コードのパス]/main.cpp:90:136: error: typename specifier refers to non-type member 'size_' in 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
332
-
333
- ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
334
-
335
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
336
-
337
- [コードのパス]/main.cpp:15:19: note: referenced member 'size_' is declared here
338
-
339
- SizeType& size_;// サイズの参照
340
-
341
- ^
342
-
343
- [コードのパス]/main.cpp:90:136: error: 'size_' is a protected member of 'BaseIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
344
-
345
- ConstIterator(Type& element, SizeType& size)noexcept:BaseIterator<Type, SizeType>::element_(element),BaseIterator<Type, SizeType>::size_(size){}// ここでコンパイルエラー発生
346
-
347
- ^
348
-
349
- [コードのパス]/main.cpp:15:19: note: must name member using the type of the current context 'ConstIterator<std::unique_ptr<int [], std::default_delete<int []> >, unsigned long>'
350
-
351
- SizeType& size_;// サイズの参照
352
-
353
-
354
-
355
- ```
356
-
357
365
 
358
366
 
359
367
  ### 開発環境の備考