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!
Â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
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
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