2012-11-15 27 views
22

Điều gì sai với mã bên dưới? Nó được cho là tìm một phần tử trong danh sách các cấu trúc nếu đầu tiên của các bộ nhớ của cấu trúc == 0. Trình biên dịch phàn nàn về đối số lambda không thuộc kiểu 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

tôi đã biên dịch mã của bạn với g ++ 4.6.3 và tất cả mọi thứ biên dịch đúng cách. Không có thông báo lỗi ở đây. Bạn đang sử dụng trình biên dịch nào? Có lẽ nó chưa hiểu lambdas. –

+0

Tôi cũng biên dịch mã này (với VC10) và không có lỗi hoặc cảnh báo, nó hoạt động như mong đợi khi chạy. Bạn đang sử dụng trình biên dịch nào? – Agentlien

+1

Bạn đang sử dụng trình biên dịch nào? – Default

Trả lời

26

Mã hoạt động tốt trên VS2012, chỉ là một đề nghị, vượt qua đối tượng bằng cách tham chiếu thay vì đi qua giá trị:

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

[&] <--- sẽ nắm bắt các biến bên ngoài bằng cách tham chiếu, vượt qua đối tượng bằng tham chiếu bạn phải sử dụng (S & s) –

+0

Chỉ muốn thêm rằng điều này hoạt động tốt với GCC/G ++ 4.7 là tốt. – Mario

Các vấn đề liên quan