C ++ 11 / g ++: в лямбде требуется спецификатор std ::, хотя дается «использование пространства имен std» - PullRequest
7 голосов
/ 16 декабря 2011

Я пытался раскрыть некоторые плюсы нового стандарта C ++ 11 (используя g ++ 4.6.2). Играя с лямбдами в функции алгоритма "all_of", я столкнулся со странной проблемой с классификатором std ::.

Я "использую" пространство имен std, как показано в начале фрагмента кода. Это делает объявление парной переменной в цикле for хорошо определенным.

Однако я попробовал то же самое в лямбда-аргументе, используемом в алгоритме "all_of". Я наткнулся на несколько трудных для понимания сообщений об ошибках, прежде чем понял, что там будет работать полная std :: qualised std :: pair, но только пара не будет.

Я упустил важный момент? Объявление лямбды происходит в этом файле, поэтому пространство имен здесь должно быть активным, верно? Или требуемый спецификатор std :: qualifier зависит от некоторого кода STL в другом файле? Или это может быть ошибка в g ++?

С наилучшими пожеланиями, Питер

PS: код компилируется без предупреждений, как вставлено здесь, но удаляя std :: в all_of lambda, я получаю сообщение об ошибке.

#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!";
};
}

Редактировать: Только что заметил, что получил ответ на этот старый вопрос. Нет проблем с этим, но, пожалуйста, уточните причины. Это поможет мне улучшить будущие вопросы, и в итоге все сообщество получит прибыль. Спасибо!

1 Ответ

8 голосов
/ 16 декабря 2011

Переименуйте переменную pair в вашем цикле for.

Это область действия должна расширяться только до конца цикла for и, следовательно, не мешать вашей лямбде, но g ++есть некоторый код для древних правил for-scoping, где это было не так, поэтому он может генерировать лучшие сообщения об ошибках для древнего кода C ++.

Похоже, что в этом коде совместимости есть ошибка.

...