C ++ 11 / g ++: std :: квалификатор требуется в лямбда-выражении, хотя указано «using namespace std»

. Я пытался обнаружить некоторые полезности нового стандарта 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: Только что заметил, что я получил отрицательный голос за этот старый вопрос. Нет проблем с этим, но, пожалуйста, поясните причины. Это поможет мне улучшить будущие вопросы, и, в конце концов, все сообщество выиграет. Спасибо!

7
задан Piotr99 30 June 2013 в 15:29
поделиться