2012-11-15 10 views
22

Cosa c'è di sbagliato con il codice qui sotto? Si suppone che trovi un elemento nell'elenco di structs se il primo dei memebers della struct == 0. Il compilatore si lamenta dell'argomento lambda che non è di tipo 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

Ho appena compilato il codice con g ++ 4.6.3 e tutto viene compilato correttamente. Nessun messaggio di errore qui. Quale compilatore stai usando? Forse non capisce ancora Lambdas. –

+0

Ho anche compilato questo codice (con VC10) e ottenuto zero errori o avvisi, funziona come previsto durante l'esecuzione. Che compilatore stai usando? – Agentlien

+1

Che compilatore stai usando? – Default

risposta

26

codice funziona bene su VS2012, un solo consiglio, passano oggetto con riferimento al posto di passaggio per valore:

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

[&] <--- cattura le variabili esterne per riferimento, passa anche oggetto per riferimento che devi usare (S & s) –

+0

Volevo solo aggiungere che funziona anche con GCC/G ++ 4.7. – Mario