2014-09-21 62 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