当前位置: 首页 > 知识库问答 >
问题:

在 gcc 4.7 中使用 std::bind 编译错误

蓬琦
2023-03-14

我在代码的不同地方使用< code>std::bind时遇到了很多问题。有时行得通,有时行不通,所以我认为我正在做一些根本错误的事情。

据我所知,std::bind的以下基本用法应该可以正常使用:

#include <functional>

int foo(int a, int b){ return a+b; }

int main(){

    using namespace std::placeholders;

    // works
    auto bar_auto=std::bind(foo,1,_2);

    // compile error
    std::function<int(int)> bar_fun=std::bind(foo,1,_2);

    int quux=1;
    // compile error
    std::function<int(int)> bar_fun_lvalue=std::bind(foo,quux,_2);

}

当然< code>bar_auto的类型是< code>std::function

它类似于这个bug,但是它太老了,我不认为它是相关的。

gcc的输出并不特别有启发性:

在文件中包含从bindnew.cpp: 1:0: /usr/include/c /4.7/functional:在实例化'静态_Resstd::_Function_handler

共有2个答案

饶志
2023-03-14

2占位符意味着使用返回函子的第二个参数。因此

std::bind(foo,1,_2)

不是 std::函数

std::function<int(unspecified_type, int)>

获取std::f

std::bind(foo, 1, _1)
//                ^^

郗鹏
2023-03-14

占位符位置对象(例如,当您使用_2)不是您调用的函数中参数的位置,而是创建的可调用对象中参数的占位符。相反,总是从_1开始,然后增加。

所以:

auto bar_auto=std::bind(foo,1,_1);

等。

这意味着你可以切换由std::bind创建的对象中的参数,只需做类似

auto bar_auto=std::bind(foo,_2,_1);

当您“调用”< code>bar_auto对象时,第一个参数将是< code>foo的第二个参数,调用中的第二个参数将是< code>foo的第一个参数。

 类似资料:
  • 我在尝试用std::function和std::bind绑定方法时遇到了一个问题。 在我的通信服务类中: CommunicationService::ManageGetRequest签名: BindGET签名: 请求函数类型定义: BindGET上的错误: 错误C2664:“void RESTServer::BindGET(RequestFunction)”:无法从“std::\u Binder”

  • 标准库函数bind()和function()定义于头文件<functional>中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int

  • 在过去的几个月里,我一直在学习C语言并使用终端。我的代码使用g和c11编译并运行得很好,但在过去几天里它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的C标准。 我第一次遇到的错误包括 尝试使用ecg$g-o stoi_试验stoi_试验编译。cpp-std=c 11 大堆cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;你是说“阿托伊”吗?in

  • 我有个问题。为什么我不能编译这个?怎么了? //此代码来自我之前帖子的答案 我有这样的错误: c:\ Program Files(x86)\ Microsoft Visual Studio 8 \ VC \ include \ algorithm(40):错误c 2784:“bool STD::operator = =(const _ Ty C:\Program Files (x86)\Micro

  • 问题内容: 我正在使用angularjs 1.2.0-rc.3。我想将html代码动态地包含到模板中。为此,我在控制器中使用: 在模板中,我得到了: 它适用于常规html代码。但是,当我尝试放置角度模板时,它不会被解释,它仅包含在页面中。例如,我想包括: 非常感谢 问题答案: 此解决方案不使用硬编码模板,您可以编译嵌入在API响应中的Angular表达式。 步骤1. 安装此指令:https : /

  • 在我的Fedora 34环境(g)中,定义为: 如果表达式已经是右值,那么