C++ g++;std::与共享\u ptr绑定错误

C++ g++;std::与共享\u ptr绑定错误,c++,c++11,g++,bind,shared-ptr,C++,C++11,G++,Bind,Shared Ptr,我很难理解为什么下面的代码不能编译 #include <memory> #include <functional> class Foo { public: void Bar(int i) {} }; void X(std::function<void(std::shared_ptr<Foo>)> f) { } int main() { std::shared_ptr<Foo> f(new Foo); auto f1

我很难理解为什么下面的代码不能编译

#include <memory>
#include <functional>

class Foo 
{
public:
  void Bar(int i) {}
};

void X(std::function<void(std::shared_ptr<Foo>)> f)
{

}

int main()
{
  std::shared_ptr<Foo> f(new Foo);
  auto f1(std::bind(&Foo::Bar, std::placeholders::_1, 1));
  X(f1);
  return 0;
}
#包括
#包括
福班
{
公众:
空条(int i){}
};
void X(标准::函数f)
{
}
int main()
{
std::共享的ptr f(新的Foo);
自动f1(std::bind(&Foo::Bar,std::占位符::_1,1));
X(f1);
返回0;
}
g++(4.6.3)输出

n file included from /usr/include/c++/4.6/memory:80:0,
                 from test.cpp:1:
/usr/include/c++/4.6/functional: In static member function ‘static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Functor = std::_Bind<std::_Mem_fn<void (Foo::*)(int)>(std::_Placeholder<1>, int)>, _ArgTypes = {std::shared_ptr<Foo>}]’:
/usr/include/c++/4.6/functional:2148:6:   instantiated from ‘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<std::_Mem_fn<void (Foo::*)(int)>(std::_Placeholder<1>, int)>, _Res = void, _ArgTypes = {std::shared_ptr<Foo>}, typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type = std::function<void(std::shared_ptr<Foo>)>::_Useless]’
test.cpp:19:7:   instantiated from here
/usr/include/c++/4.6/functional:1778:2: error: no match for call to ‘(std::_Bind<std::_Mem_fn<void (Foo::*)(int)>(std::_Placeholder<1>, int)>) (std::shared_ptr<Foo>)’
/usr/include/c++/4.6/functional:1130:11: note: candidates are:
/usr/include/c++/4.6/functional:1201:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {_Args ...}, _Result = _Result, _Functor = std::_Mem_fn<void (Foo::*)(int)>, _Bound_args = {std::_Placeholder<1>, int}]
/usr/include/c++/4.6/functional:1215:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const [with _Args = {_Args ...}, _Result = _Result, _Functor = std::_Mem_fn<void (Foo::*)(int)>, _Bound_args = {std::_Placeholder<1>, int}]
/usr/include/c++/4.6/functional:1229:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) volatile [with _Args = {_Args ...}, _Result = _Result, _Functor = std::_Mem_fn<void (Foo::*)(int)>, _Bound_args = {std::_Placeholder<1>, int}]
/usr/include/c++/4.6/functional:1243:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const volatile [with _Args = {_Args ...}, _Result = _Result, _Functor = std::_Mem_fn<void (Foo::*)(int)>, _Bound_args = {std::_Placeholder<1>, int}]
n文件包含在/usr/include/c++/4.6/memory:80:0中,
来自测试。cpp:1:
/usr/include/c++/4.6/functional:在静态成员函数“static void std::_function_handler::_M_invoke(const std::_Any_data&,_ArgTypes…[带_Functor=std::_Bind,_ArgTypes={std::shared ptr}]:
/usr/include/c++/4.6/functional:2148:6:从“std::function”(\u Functor,typename std::enable\u if::type)[with _Functor=std::\u Bind,\u Res=void,\u ArgTypes={std::shared\u ptr},typename std::enable\u if::type=std::function:\u无用]”实例化
test.cpp:19:7:从此处实例化
/usr/include/c++/4.6/functional:1778:2:错误:调用“(std::_Bind)(std::shared_ptr)”时不匹配
/usr/include/c++/4.6/functional:1130:11:注:候选项包括:
/usr/include/c++/4.6/functional:1201:2:注意:模板(结果std:):(绑定&&…[带(Args={Args…},)结果=(结果),(Functor=std:):(内存(fn,)绑定(Args={std:)占位符,int}]
/usr/include/c++/4.6/functional:1215:2:注意:模板(结果std:):(绑定&&…)操作符()()参数&…)常量[带(参数={(参数…},)结果=(结果,)函数=std:(内存)fn,(绑定)参数={std:(占位符,int}]
/usr/include/c++/4.6/functional:1229:2:注意:模板(结果std:):(绑定&&…)操作符()((参数&&…)volatile[带有(参数={(参数…},)结果=(结果,)函子=std:(内存)fn,(绑定)参数={std:(占位符,int}]
/usr/include/c++/4.6/functional:1243:2:注:模板(结果std:):(绑定&&…)运算符()()参数&…)常量volatile[带(参数={Args…},(结果=)结果,(Functor=std:)Mem fn,(绑定)参数={std:(占位符,int}]

这是一个GCC错误,我在4.7中修复了它,但我不记得到底是哪个错误。我会设法弄明白的

Edit:Aha,4.7中没有固定,它只固定在GCC主干上(将是4.8)


错误在于
mem_fn
返回的调用包装器不接受右值,并且您的
std::functionTry
std::bind(&Foo::Bar,f.get(),1)
我认为这应该计算为Bar(1)@user814628,这如何帮助将
f1
传递到
X
void X(std::function<void(const std::shared_ptr<Foo>&)> f)