2014-09-21 61 views
0

下面的代码段编译没有问题:的std ::绑定产生在的libstdc编译错误++

void dimse_pm::f() 
{ 
     ul.inject(upperlayer::TYPE::A_ASSOCIATE_RQ, 
      [=](upperlayer::scx* sc, std::unique_ptr<upperlayer::property> rq) { 
       associate(sc, std::move(rq)); 
      } 
     ); 
} 

然而,使用std ::绑定以下代码编译失败。

void dimse_pm::f() 
{ 
    using namespace std::placeholders; 
    ul.inject(upperlayer::TYPE::A_ASSOCIATE_RQ, 
     std::bind(&dimse_pm::associate, this, _1)); 
} 

这是我的错误:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/functional:1925:2: error: no matching function for call to  object of type 'std::_Bind<std::_Mem_fn<void (dimse_pm::*)(upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >)> (dimse_pm *, std::_Placeholder<1>)>' 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/functional:2298:33: note: in instantiation of member function 'std::_Function_handler<void (upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >), std::_Bind<std::_Mem_fn<void (dimse_pm::*)(upperlayer::scx *, std::unique_ptr<upperlayer::property, std::default_delete<upperlayer::property> >)> 
    (dimse_pm *, std::_Placeholder<1>)> >::_M_invoke' requested here 
     _M_invoker = &_My_handler::_M_invoke; 
           ^
dimse_pm.cpp:25:14: note: in instantiation of function template specialization 'std::function<void (upperlayer::scx *, std::unique_ptr<upperlayer::property, std::default_delete<upperlayer::property> 
    >)>::function<std::_Bind<std::_Mem_fn<void (dimse_pm::*)(upperlayer::scx *, std::unique_ptr<upperlayer::property, std::default_delete<upperlayer::property> >)> (dimse_pm *, std::_Placeholder<1>)> >' requested here 
     std::bind(&dimse_pm::associate, this, _1)); 
     ^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/functional:1211:2: note: candidate template ignored: substitution failure [with _Args = <upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >>]: no matching function for call to object of type 'std::_Mem_fn<void (dimse_pm::*)(upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >)>' 
    operator()(_Args&&... __args) 
    ^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/functional:1225:2: note: candidate template ignored: substitution failure [with _Args = <upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >>]: no matching function for call to object of type 'const std::_Mem_fn<void (dimse_pm::*)(upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >)>' 
    operator()(_Args&&... __args) const 
    ^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/functional:1239:2: note: candidate template ignored: substitution failure [with _Args = <upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >>]: no matching function for call to object of type 'volatile std::_Mem_fn<void (dimse_pm::*)(upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >)>' 
    operator()(_Args&&... __args) volatile 
    ^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/functional:1253:2: note: candidate template ignored: substitution failure [with _Args = <upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >>]: no matching function for call to object of type 'const volatile std::_Mem_fn<void (dimse_pm::*)(upperlayer::scx *, std::unique_ptr<upperlayer::property, 
    std::default_delete<upperlayer::property> >)>' 
    operator()(_Args&&... __args) const volatile 

associatedimse_pm而不是重载的成员函数。调用注入函数的对象ul存储std::function<void(scx*, std::unique_ptr<property>)>。我想摆脱这个指针。这个错误发生在clang 3.5和gcc 4.7.3上。

+0

'associate'不是重载的,但是你用不同数量的参数调用它。你忘了'_2'吗? – Oktalist 2014-09-21 15:03:16

+0

注入函数存储'ul'对象中的'std :: function )>''。所以我想摆脱这个隐含的指针。 – 2014-09-21 15:13:06

回答

3
[=](upperlayer::scx* sc, std::unique_ptr<upperlayer::property> rq) { 
    associate(sc, std::move(rq)); 
} 

此lambda函数对象调用associate用两个参数(upperlayer::scx*std::unique_ptr<upperlayer::property>&&)加上this指针。

std::bind(&dimse_pm::associate, this, _1) 

此绑定表达对象调用associate与一个参数加上this指针,这将失败,因为associate需要两个参数加上this指针。

你想要的是这样的:

std::bind(&dimse_pm::associate, this, _1, _2) 

this, _1, _2意味着this将被捕获并转发,隐含this参数associate,到绑定表达式的电话运营商的第一个参数将被转发的第一次明确参数为associate,绑定表达式的调用操作符的第二个参数将作为第二个显式参数转发给associate

+0

谢谢。我在std :: bind的工作原理方面有一个基本的谬误。现在很清楚。 – 2014-09-21 15:29:38