2012-05-15 18 views
12

Yalnızca güçlendirmeyi test etmek için basit bir örnek yazıyorum :: bind. Bir şablon üye işlevi başlatmak için kullanıyorum, ancak g ++ 4.6.0 ile derleme yapmaz. Sorunun ne olduğunu bilmiyorum.boost :: bind üye şablon işleviyle derleme yapmıyor

In file included from /usr/include/boost/bind.hpp:22:0, 
       from testBind.cpp:1: 
/usr/include/boost/bind/bind.hpp: In member function ‘void boost::_bi::list2<A1, A2>::operator()(boost::_bi::type<void>, F&, A&, int) [with F = boost::_mfi::mf1<void, DerivedFinishAction, boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > > >, A = boost::_bi::list0, A1 = boost::_bi::value<DerivedFinishAction*>, A2 = boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > >]’: 
/usr/include/boost/bind/bind_template.hpp:20:59: instantiated from ‘boost::_bi::bind_t<R, F, L>::result_type boost::_bi::bind_t<R, F, L>::operator()() [with R = void, F = boost::_mfi::mf1<void, DerivedFinishAction, boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > > >, L = boost::_bi::list2<boost::_bi::value<DerivedFinishAction*>, boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > > >, boost::_bi::bind_t<R, F, L>::result_type = void]’ 
testBind.cpp:24:5: instantiated from ‘void DerivedFinishAction::TmplFunc(T) [with T = boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > >]’ 
testBind.cpp:37:58: instantiated from here 
/usr/include/boost/bind/bind.hpp:313:9: error: invalid use of void expression 

kimse bu açıklamaya yardımcı olabilir:

#include <boost/bind.hpp> 

struct Functor 
{ 
    void operator()() 
    { 

    } 
}; 

struct DerivedFinishAction 
{ 
    DerivedFinishAction() 
    {} 

    void Inc() 
    { 

    } 

    template <typename T> 
    void TmplFunc(T t) 
    { 
    (boost::bind(&DerivedFinishAction::BindFunc<T>, this , t))(); 
    } 

    template <typename T> 
    void BindFunc(T t) 
    { 
    t(); 
    } 

    void Func() 
    { 
    Functor f; 
    TmplFunc(f); // this is OK 
    TmplFunc(boost::bind(&DerivedFinishAction::Inc, this)); // compile error 
    } 
}; 

int main(int argc, char *argv[]) 
{ 

    return 0; 
} 

Ve gr ++ aşağıdaki hataları verir: İşte kod? Neden ilk örnekleme tamam, ikincisi derleme hatasına neden olur?

+1

Bu çok garip .. –

+0

@SethCarnegie, 15 dakika, sadece bu XD için – chris

cevap

13

boost::bind ile ilgili (açık olmayan) bir özellik var. http://www.boost.org/libs/bind/#nested_binds

Eğer yazarsanız:

void func1(int len) {return len+1;}; 
int func2(std::string str) {return str.length();}; 

assert(
    boost::bind(func1, boost::bind(func2, _1))("Hello") 
    == 6); 

boost::bind ne demek istediğini "ardından "Hello" üzerinde func2 çalıştırmak sonucu func1 çalıştırmak" olduğunu varsayar. Bu daha ilginç kısmi işlev uygulamasına izin verir. Programınızda

, sen tutarındaki bir deyim vardır: Bu argümanlar üzerine DerivedFinishAction::Inc nasıl çalıştırılacağını anlamaya

boost::bind(&DerivedFinishAction::BindFunc<...>, 
      this, 
      boost::bind(&DerivedFinishAction::Inc, this)) 

Yani boost::bind denemeden, bu yüzden DerivedFinishAction::BindFunc<...> içine sonucu geçebilir. Ancak DerivedFinishAction::Inc, DerivedFinishAction::BindFunc<...>'a geçirilemeyen void değerini döndürür. Böylece bir derleyici hatası alıyorum:

/usr/include/boost/bind/bind.hpp:313:9: error: invalid use of void expression 

Düzenleme: belgelerine gereğince, istenilen davranışı elde etmek protect kullanabilirsiniz:

#include <boost/bind/protect.hpp> 
... 
TmplFunc(boost::protect(boost::bind(&DerivedFinishedAction::Inc, this))); // no longer an error 
... 
+0

"boost :: bind" in bu özelliği de "std :: bind" için geçerlidir. – ildjarn

+0

Çözüm harika. Teşekkürler @Managu – airekans

İlgili konular