ページ 11

for eachの使い方

Posted: 2013年3月17日(日) 01:30
by heim
for each文を使うために

コード:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> vec;
    vec.push_back("for");
    vec.push_back("each");

    for each (int str in vec) {
        cout << str << endl;
    }

    return 0;
}
のようにすると、for each (int str in vec) の"vec"の部分に波線が引かれ、

std::vector(int, std::allocator<int>>::iterator std::vector<int, std::allocator<int>>::begin()
+1 オーバーロード
Error: "std::vector<int, std::allocator<int>>"型の式では'for each'ステートメントは実行できません

というエラーが表示されます。どうすればいいのでしょうか?
VisualStudio2012です。

Re: for eachの使い方

Posted: 2013年3月17日(日) 01:55
by zxc
  自分はfor each構文使ったことがないので的外れかもしれませんが、検索してみるとvector<T>とfor each(T ~)の二つのTの型が同じでないといけないようです。一応以下のように変更してみたところ、動きました。

コード:


#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
int main()
{
    vector<string> vec;
    vec.push_back("for");
    vec.push_back("each");
 
    for each (string str in vec) {
        cout << str << endl;
    }
 
    return 0;
}


実行結果

コード:

for
each
続行するには何かキーを押してください . . .

Re: for eachの使い方

Posted: 2013年3月17日(日) 02:10
by heim
zxc さんが書きました:  自分はfor each構文使ったことがないので的外れかもしれませんが、検索してみるとvector<T>とfor each(T ~)の二つのTの型が同じでないといけないようです。一応以下のように変更してみたところ、動きました。
すみません、いろいろ変更して試したしたせいで間違えてしまったようです。
提示されたソースコードでもやはりできませんが、エラーメッセージがこのようにかわりました。

std::vector<std::string, std::allocator<std::string> >vec
Error: "std::vector<std::string, std::allocator<std::string>>"型の式では'for each'ステートメントは実行できません

Re: for eachの使い方

Posted: 2013年3月17日(日) 02:44
by heim
連投済みません。試さずに質問してしまって申し訳ないのですが、赤の波線を無視してコンパイルしたところ、成功してしまい実行もできました。
なぜエディタに警告を示す赤の波線が引かれたのでしょう?

Re: for eachの使い方

Posted: 2013年3月17日(日) 13:26
by Suikaba
VS2012で全く同様のコードが動作しましたので、そのErrorの原因はごめんなさい、わからないです。
しかし、VS2012なら Range-based for が使える上、そうでなくても標準の std::for_each がありますので、そちらを使うことを推奨します。for each( type v in container ) の形はコンパイラの独自拡張で不安定かつ互換性もなかった気がします。