gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:45 27 4
gpt4 key购买 nike

我试图发现新的 C++11 标准(使用 g++ 4.6.2)的一些优点。在“all_of”算法函数中使用 lambda 时,我遇到了一个关于 std::限定符的奇怪问题。

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

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

我是否遗漏了重要的一点? lambda 的声明发生在这个文件中,所以命名空间在这里应该仍然有效,对吧?或者所需的 std::限定符是否依赖于不同文件中的某些 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!";
};
}

编辑:刚注意到我收到了对这个老问题的反对票。没问题,但请详细说明原因。它将帮助我改进 future 的问题,最终整个社区都会受益。谢谢!

最佳答案

重命名 for 循环中的变量 pair

它的范围应该只延伸到for 循环的末尾,因此不会干扰你的lambda,但是 g++ 有一些用于古老的 for 范围规则的代码,但情况并非如此,因此它可以为古老的 C++ 代码发出更好的错误消息。

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

关于C++11/g++:lambda 中需要 std::qualifier,尽管给出了 "using namespace std",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8534687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com