C ++ 11 / g ++:lambda中需要std :: qualifier,尽管给出了“using namespace std”

时间:2011-12-16 13:14:42

标签: c++ lambda g++ c++11

我试图发现新C ++ 11标准的一些好处(使用g ++ 4.6.2)。在“all_of”算法函数中使用lambdas,我遇到了std :: qualifier的一个奇怪问题。

我正在“使用”std命名空间,如代码片段的开头所示。这使得for循环中的变量声明定义良好。

但是,我在“all_of”算法中使用的lambda参数中尝试了相同的操作。在我意识到完整的std :: qualified std :: pair可以在那里工作之前,我遇到了几个难以理解的错误消息,但只有一对没有。

我错过了一个重点吗? lambda的声明发生在这个文件中,所以命名空间在这里仍然应该是活动的,对吧?或者所需的std :: qualifier是否依赖于不同文件中的某些STL代码?或者它可能是g ++中的错误?

祝你好运, 彼得

PS:代码在没有警告的情况下进行编译,但是在all_of lambda中删除std ::,我收到一条错误消息。

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

编辑:刚刚注意到我收到了这个旧问题的downvote。没问题,但请详细说明原因。它将帮助我改进未来的问题,最终整个社区将获利。谢谢!

1 个答案:

答案 0 :(得分:8)

在for循环中重命名变量pair

它的范围仅延伸到for循环的末尾,因此不会干扰您的 lambda,但g ++有一些古代for-scoping规则的代码,但事实并非如此,因此它可以为古老的C ++代码发出更好的错误消息。

看起来该兼容性代码中存在错误。