我试图发现新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。没问题,但请详细说明原因。它将帮助我改进未来的问题,最终整个社区将获利。谢谢!
答案 0 :(得分:8)
在for循环中重命名变量pair
。
它的范围应仅延伸到for
循环的末尾,因此不会干扰您的
lambda,但g ++有一些古代for-scoping规则的代码,但事实并非如此,因此它可以为古老的C ++代码发出更好的错误消息。
看起来该兼容性代码中存在错误。