. Я пытался обнаружить некоторые полезности нового стандарта C ++ 11 (используя g ++ 4.6 .2). Играя с лямбдами в функции алгоритма all_of, я столкнулся со странной проблемой с квалификатором std ::.
Я «использую» пространство имен std, как показано в начале фрагмента кода.Это делает объявление парной переменной в цикле for четко определенным.
Однако я попробовал то же самое с лямбда-аргументом, используемым в алгоритме all_of. Я наткнулся на несколько трудных для понимания сообщений об ошибках, прежде чем понял, что там будет работать полная std :: квалифицированная std :: pair, а только пара - нет.
Я упустил важный момент? Объявление лямбда-выражения происходит в этом файле, поэтому пространство имен все еще должно быть активным, верно? Или требуемый квалификатор std :: зависит от некоторого кода STL в другом файле? Или это может быть ошибка в g ++?
С уважением, Питер
PS: код компилируется без предупреждений, как здесь, но, удалив std :: в лямбде all_of, я получаю сообщение об ошибке.
#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!";
};
}
Edit: Только что заметил, что я получил отрицательный голос за этот старый вопрос. Нет проблем с этим, но, пожалуйста, поясните причины. Это поможет мне улучшить будущие вопросы, и, в конце концов, все сообщество выиграет. Спасибо!