2011-12-16 36 views
7

Tôi đã cố gắng khám phá một số tính năng của chuẩn C++ 11 mới (sử dụng g ++ 4.6.2) . Chơi xung quanh với lambdas trong một chức năng thuật toán "all_of", tôi gặp phải một vấn đề lạ với std :: qualifier.C++ 11/g ++: std :: qualifier được yêu cầu trong lambda, mặc dù "using namespace std" được đưa ra

Tôi đang "sử dụng" không gian tên std như được hiển thị ở đầu đoạn mã. Điều này làm cho việc khai báo biến cặp trong vòng lặp for được xác định rõ.

Tuy nhiên, tôi đã thử tương tự trong đối số lambda được sử dụng trong thuật toán "all_of". Tôi đã gặp một số thông báo lỗi khó hiểu, trước khi tôi nhận ra rằng một std :: đủ điều kiện std :: cặp sẽ làm việc ở đó, nhưng chỉ cặp không.

Tôi có thiếu điểm quan trọng không? Việc khai báo lambda xảy ra trong tệp này, do đó không gian tên nên vẫn hoạt động ở đây, đúng không? Hoặc không yêu cầu std :: qualifier phụ thuộc vào một số mã STL trong một tập tin khác nhau? Hoặc là nó có thể là một lỗi trong g + +?

Trân trọng, Peter

PS: mã biên dịch mà không cần cảnh báo như dán ở đây, nhưng loại bỏ các std :: ở lambda all_of, tôi nhận được một thông báo lỗi.

#include <iostream> 
#include <memory> 
#include <map> 
#include <string> 
#include <algorithm> 
#include <utility> 

using namespace std; 

void duckburg() { 

const int threshold = 100; 
map <string, int> money; 

money["donald"] = 200; 
money["daisy"] = 400; 
money["scrooge"] = 2000000; 

// obviously, an "auto" type would work here nicely, 
// but this way my problem is illustrated more clearly: 

for (const pair <string, int> &pair : money) { 
    cout << pair.first << "\t" << pair.second << endl; 
} 

if (all_of(money.begin(), money.end(), 
    [&](std::pair<string, int> p) { 
    return bool(p.second > threshold); 
})) 
{ 
    cout << "yes, everyone is rich!"; 
} else { 
    cout << "no, some are poor!"; 
}; 
} 

Chỉnh sửa: Chỉ cần nhận thấy tôi đã nhận được một lưu ý cho câu hỏi cũ này. Không có vấn đề với điều đó, nhưng xin vui lòng xây dựng trên lý do. Nó sẽ giúp tôi cải thiện các câu hỏi trong tương lai, và cuối cùng toàn bộ cộng đồng sẽ có lợi nhuận. Cảm ơn!

+3

Âm thanh như một lỗi trong GCC, biên dịch tốt với MSVC 10. Không thể kiểm tra với Clang, vì chúng chưa triển khai lambdas. FWIW, GCC 4.5.1 không có vấn đề với [mã giảm thiểu này] (http://ideone.com/LdGJT). – Xeo

+0

có, tôi đã thử nghiệm với/không có đề cập std :: trong Clang bản thân mình, nhưng bây giờ nó không thể vì lambdas mất tích. – Piotr99

+1

Bạn nên tạo một phiên bản với tất cả các mã không cần thiết đã bị xóa và cung cấp thông báo lỗi. – Mankarse

Trả lời

8

Đổi tên biến pair trong vòng lặp for của bạn.

Đó là phạm vi nên chỉ kéo dài đến cuối for vòng lặp và do đó không gây trở ngại cho lambda của bạn, nhưng g ++ có một số mã cho các quy tắc cho-Phạm vi cổ xưa, nơi đó không phải là trường hợp, vì vậy nó có thể phát ra tốt hơn thông báo lỗi cho mã C++ cổ.

Dường như có lỗi trong mã tương thích đó.

+0

Vâng, cảm ơn! Đó là sự thật - với một tên biến khác nhau trong vòng lặp nó hoạt động! Tuy nhiên, tôi đồng ý với bạn, nó phải được giới hạn trong phạm vi của vòng lặp ... – Piotr99

+1

Đối với hồ sơ, đã có báo cáo lỗi gcc: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10852 - lambda chỉ làm cho thông báo lỗi tồi tệ hơn. – wolfgang

+0

wow, tốt để biết! – Piotr99

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