2012-11-15 14 views
22

以下のコードで何が問題になっていますか? structのメンバの最初のものが== 0の場合、structのリストの中の要素を見つけるはずです。コンパイラは、Lambda引数が型Predicateではないと不平を言っています。C++ find_if lambda

#include <iostream> 
#include <stdint.h> 
#include <fstream> 
#include <list> 
#include <algorithm> 

struct S 
{ 
    int S1; 
    int S2; 
}; 

using namespace std; 

int main() 
{ 
    list<S> l; 
    S s1; 
    s1.S1 = 0; 
    s1.S2 = 0; 
    S s2; 
    s2.S1 = 1; 
    s2.S2 = 1; 
    l.push_back(s2); 
    l.push_back(s1); 

    list<S>::iterator it = find_if(l.begin(), l.end(), [] (S s) { return s.S1 == 0; }); 
} 
+3

私はちょうどグラム++ 4.6.3を使用してコードをコンパイルし、すべてが正常にコンパイルされます。ここにエラーメッセージはありません。どのコンパイラを使用していますか?ラムダをまだ理解していないのかもしれない。 –

+0

私もVC10でこのコードをコンパイルし、エラーや警告はゼロになりました。 どのコンパイラを使用していますか? – Agentlien

+1

どのコンパイラを使用していますか? – Default

答えて

26

コードVS2012、ちょうど1つの勧告に正常に動作し、値によって代わりのパスの参照によってオブジェクトを渡す:

list<S>::iterator it = find_if(l.begin(), l.end(), [] (const S& s) { return s.S1 == 0; }); 
+6

[&] <---参照によって外部変数を取得します。使用する必要がある参照によってオブジェクトを渡します。 –

+0

GCC/G ++ 4.7でも正しく動作することを追加したいとします。 – Mario