質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3500閲覧

イテレーターについて

nicoyou

総合スコア129

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/02/05 05:13

編集2019/02/05 05:29

C

1 for (auto itr = _data_list.begin(); itr != _data_list.end(); itr++) 2 { // 初期の数値を読み込む 3 itr->value = GetPrivateProfileInt(itr->section.c_str(), itr->key.c_str(), itr->value, itr->path.c_str()); // iniファイルから読み込む 4 if (itr->key == "use_pad" && itr->value == 1) // もしゲームパッドを使うなら 5 { 6 set_pad_config(); 7 } 8 } 9 10//↓ 11 12 for (auto itr : _data_list) 13 { // 初期の数値を読み込む 14 itr->value = GetPrivateProfileInt(itr->section.c_str(), itr->key.c_str(), itr->value, itr->path.c_str()); // iniファイルから読み込む 15 if (itr->key == "use_pad" && itr->value == 1) // もしゲームパッドを使うなら 16 { 17 set_pad_config(); 18 } 19 }

上のようにプログラムを書き換えると__式にはポインター型が必要です__というエラーをはかれたのですが、なぜでしょうか?
原因が分からないので足らなければ他にどのような情報を書けばいいか教えてください

win10 VC++2017

->を.に変更した際にエラーはなくなったのですが、値を変更することはできていませんでした
auto& itr : _data_listにしてもダメでした

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E0044 式にはポインター型が必要です th_act_remake C:\Users\nicoyou\Documents\Visual Studio 2017\Projects\th_act_remake\th_act_remake\ConfigScene.cpp 157
エラー (アクティブ) E0044 式にはポインター型が必要です th_act_remake C:\Users\nicoyou\Documents\Visual Studio 2017\Projects\th_act_remake\th_act_remake\ConfigScene.cpp 157
エラー (アクティブ) E0044 式にはポインター型が必要です th_act_remake C:\Users\nicoyou\Documents\Visual Studio 2017\Projects\th_act_remake\th_act_remake\ConfigScene.cpp 157
エラー (アクティブ) E0044 式にはポインター型が必要です th_act_remake C:\Users\nicoyou\Documents\Visual Studio 2017\Projects\th_act_remake\th_act_remake\ConfigScene.cpp 157
エラー (アクティブ) E0044 式にはポインター型が必要です th_act_remake

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/02/05 05:16

「どの行で」エラーが出たかと、正確なエラーメッセージ(全文コピペ)を示していただければと思います。
nicoyou

2019/02/05 05:26

ありがとうございます 追記しました
guest

回答3

0

ベストアンサー

こんにちは。

前半のコードを後半に書き換えたのですね? YESと仮定して回答します。

for (auto itr : _data_list)

は範囲ベースforと呼ばれる機能で、itrはイテレータではありません。_data_listに格納されている要素がコピーされて格納されます。cpprefjp - C++日本語リファレンスを参考にされると分かりやすいです。

因みに、エラーはitr->valueなどのコードで出ている筈です。itrはポインタ型ではありません。またアロー演算子を持たない型でしょうから、そのようなエラーが出ます。イテレータは一般にクラスです。そして、アロー演算子が定義されています。

投稿2019/02/05 05:28

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nicoyou

2019/02/05 05:31

ご回答ありがとうございます 頂いたURLを見てこのように変更したのですが、意味が違ったのですね.... 結論は修正前の書き方でないといけないということでしょうか?
Chironian

2019/02/05 06:25 編集

範囲ベースforは「ポインタ」構文では使えません。また「参照」構文で使うことも多いので、参照を理解していないと結構はまります。参照の基本を理解できていない間は従来通りのイテレータ方式で使った方が確実と思います。 > 実体 auto eを書くと各要素がコピーコンストラクタによってコピーされてからfor文に渡される。 とある通り、_data_listの要素がコピーされてitrに入っていますから、itrを変更しても_data_listには反映されません。 この直前に次のように書かれています。 > 参照 auto& eを書くと、コンテナ内の要素を変更できる。 つまり、itrを参照として定義すれば_data_listへ反映できるということです。 参照の概念はポインタの概念より難しいですが、アドレスを変更できないポインタと理解しても大きくは外れないです。主旨やできることが異なるため構文が異なるのでちょっと難しいので慣れが必要ですね。
guest

0

範囲ベースのfor文の場合、auto itrのitrはイテレータ型ではなく、

vector<Hogehoge> _data_list; と宣言した際のHogehoge型になります。

ですので、以下のようにドットを使うのが正しいかと思います。

C++

1 vector<Hogehoge> _new_list; 2 for (auto itr : _data_list) 3 { // 初期の数値を読み込む 4 Hogehoge new_item(itr); // ←要コピーコンストラクタ 5 new_item.value = GetPrivateProfileInt(itr.section.c_str(), itr.key.c_str(), itr.value, itr.path.c_str()); 6 _new_list.push_back(new_item);

投稿2019/02/05 05:29

編集2019/02/05 06:35
kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nicoyou

2019/02/05 05:33

ご回答ありがとうございます ->を.に変更した際にエラーはなくなったのですが、itr.valueの値を変更することはできていませんでした
kazto

2019/02/05 06:32

そうですね。 あくまでitrは_data_list内のデータのコピーだったかと(←ちょっと不正確です)。 こういう場合は直接vectorを書き換えようとせず、新たなvectorを用意して変更したものを追加していく、とするのがよくあるパターンです。
nicoyou

2019/02/05 07:33

そうだったんですね... こういうものは最近勉強し始めたので...m(__)m
guest

0

ぱっと見ですが、for文の中のitrをポインターにしてください
*itr->

投稿2019/02/05 05:25

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nicoyou

2019/02/05 05:27

変わりませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問