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

我在代码的各个地方使用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);

}

当然, bar_auto的类型是std::function<int(int)> (带有1个int参数的foo类型),那么为什么bar_fun不能编译? 我包括bar_fun_lvalue因为一些Google搜索显示我曾经有过rvalues问题。 但是这并没有解决任何问题。

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

gcc的输出并不特别令人启发:

在包含bindnew.cpp的文件中:1:0:/usr/include/c++/4.7/functional:在实例化静态_Res std :: _ Function_handler <_Res(_ArgTypes ...),_Functor> :: _ M_invoke(const std :: _ Any_data&,_ArgTypes ...)[with _Res = int; _Functor = std :: _ Bind))(int,int)>; _ArgTypes = {int}]':/usr/include/c++/4.7/functional:2298:6:需要从'std :: function <_Res(_ArgTypes ...)> :: function(_Functor,typename std :: enable_if <(!std :: is_integral <_Functor> :: value),std :: function <_Res(_ArgTypes ...)> :: _ Useless> :: type)[with _Functor = std :: _ Bind))(int,int )>; _Res = int; _ArgTypes = {int}; typename std :: enable_if <(!std :: is_integral <_Functor> :: value),std :: function <_Res(_ArgTypes ...)> :: _ Useless> :: type = std :: function :: _ Useless]' bindnew.cpp:15:52:从这里需要/usr/include/c++/4.7/functional:1912:40:error:不匹配调用'(std :: _ Bind))(int,int)>)(int )'/usr/include/c++/4.7/functional:1140:11:note:candidates are:/usr/include/c++/4.7/functional:1211:2:note:template _Result std :: _ Bind <_Functor(_Bound_args。 ..)> :: operator()(_ Args && ...)[with _Args = {_Args ...}; _Result = _Result; _Functor = int(*)(int,int); _Bound_args = {int,std :: _占位符<2>}] /usr/include/c++/4.7/functional:1211:2:note:
模板参数推导/替换失败:/usr/include/c++/4.7/functional:1206:35:错误:不能在参数传递中将'std :: _ No_tuple_element'转换为'int'/usr/include/c++/4.7/functional: 1225:2:note:template _Result std :: _ Bind <_Functor(_Bound_args ...)> :: operator()(_ Args && ...)const [with _Args = {_Args ...}; _Result = _Result; _Functor = int(*)(int,int); _Bound_args = {int,std :: _占位符<2>}] /usr/include/c++/4.7/functional:1225:2:note:
模板参数推导/替换失败:/usr/include/c++/4.7/functional:1219:35:错误:不能在参数传递中将'std :: _ No_tuple_element'转换为'int'/usr/include/c++/4.7/functional: 1239:2:note:template _Result std :: _ Bind <_Functor(_Bound_args ...)> :: operator()(_ Args && ...)volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = int(*)(int,int); _Bound_args = {int,std :: _占位符<2>}] /usr/include/c++/4.7/functional:1239:2:note:
模板参数推导/替换失败:/usr/include/c++/4.7/functional:1233:35:错误:无法在参数传递中将'std :: _ No_tuple_element'转换为'int'/usr/include/c++/4.7/functional: 1253:2:note:template _Result std :: _ Bind <_Functor(_Bound_args ...)> :: operator()(_ Args && ...)const volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = int(*)(int,int); _Bound_args = {int,std :: _占位符<2>}] /usr/include/c++/4.7/functional:1253:2:note:template argument deduction / substitution failed:/usr/include/c++/4.7/functional:1247 :35:错误:不能将'std :: _ No_tuple_element'转换为参数传递中的'int'


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

所以:

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

等等


这意味着你可以通过简单地做这样的操作来切换由std::bind创建的对象中的参数

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

当你“调用” bar_auto对象时,第一个参数将成为foo的第二个参数,而第二个参数将成为foo的第一个参数。


_2占位符表示使用返回函数的第二个参数。 因此,类型

std::bind(foo,1,_2)

不是std::function<int(int)>但是

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

要获得std::function<int(int)> ,请使用

std::bind(foo, 1, _1)
//                ^^
链接地址: http://www.djcxy.com/p/29751.html

上一篇: Compile errors using std::bind in gcc 4.7

下一篇: std::async call of member function