如何修复“错误:‘_1’未在此范围内声明”?

Posted

技术标签:

【中文标题】如何修复“错误:‘_1’未在此范围内声明”?【英文标题】:How to fix "error: ‘_1’ was not declared in this scope"? 【发布时间】:2020-07-05 06:25:39 【问题描述】:

我目前正在尝试将函数绑定到我打算使用的算法。

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
    vector<int> coll1, 2, 3, 4, 5, 6;

    vector<int>::iterator pos;
    pos = find_if (coll.begin(), coll.end(), 
                    bind(greater<int>(),_1,3)); 

    return 0;

并获得此错误反馈:

AlgoTesting.cpp: In function ‘int main()’:
AlgoTesting.cpp:184:41: error: ‘_1’ was not declared in this scope
                     bind(greater<int>(),_1,3)); // criterion
                                         ^~
AlgoTesting.cpp:184:41: note: suggested alternative:
In file included from algostuff.hpp:15:0,
                 from AlgoTesting.cpp:5:
/usr/include/c++/7/functional:275:34: note:   ‘std::placeholders::_1’
     extern const _Placeholder<1> _1;
                                  ^~

我很难理解错误日志的含义。有人知道我在这里缺少什么吗?

【问题讨论】:

使用 lambda 而不是 std::bind 通常更容易,提供更好的错误消息,并且作为奖励甚至可能产生更快的代码 @AlanBirtles:谢谢,毫无疑问。还请在下面找到我对答案的评论。由于bind 本身的使用,我遇到了这个问题,这就是我写这篇文章的原因。这真的不是关于哪个更好。 【参考方案1】:

您需要包含&lt;functional&gt; 并使用std::placeholders::_1

pos = find_if (coll.begin(), coll.end(), bind(greater<int>(),placeholders::_1,3));

更简单的选择是使用lambda:

pos = find_if(coll.begin(), coll.end(), [](int v)  return std::greater<int>(v, 3); );

pos = find_if(coll.begin(), coll.end(), [](int v)  return 3 < v; );

【讨论】:

感谢您的回答。我知道使用lambda。这确实容易多了,但我目前正在学习bind 的用法,我的问题专门出现在那个用例上。 @dboy 好的。我发现每当出现 bind 时最好提及 lambdas。【参考方案2】:

要使用std::bind,需要包含标题#include &lt;functional&gt;,也不要忘记using namespace placeholders

this post. 中还提供了一些其他信息

【讨论】:

以上是关于如何修复“错误:‘_1’未在此范围内声明”?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复 npm 审计修复问题?

如何修复WMI

如何修复AppScan漏洞

如何在DOS环境下修复系统

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)