2010-02-20 9 views
67

Il seguente codice causa l'arresto anomalo di cl.exe (MS VS2005).
Sto cercando di utilizzare spinta legano per creare una funzione a una chiama un metodo di MyClass:Come utilizzare il binding boost con una funzione membro

#include "stdafx.h" 
#include <boost/function.hpp> 
#include <boost/bind.hpp> 
#include <functional> 

class myclass { 
public: 
    void fun1()  { printf("fun1()\n");  } 
    void fun2(int i) { printf("fun2(%d)\n", i); } 

    void testit() { 
     boost::function<void()> f1(boost::bind(&myclass::fun1, this)); 
     boost::function<void (int)> f2(boost::bind(&myclass::fun2, this)); //fails 

     f1(); 
     f2(111); 
    } 
}; 

int main(int argc, char* argv[]) { 
    myclass mc; 
    mc.testit(); 
    return 0; 
} 

Che cosa sto facendo di sbagliato?

risposta

89

Utilizza il seguente invece:

boost::function<void (int)> f2(boost::bind(&myclass::fun2, this, _1)); 

Questo inoltra il primo parametro passato all'oggetto funzione per la funzione utilizzando luogo titolari - dovete dire Boost.Bind come gestire i parametri. Con la tua espressione cercherebbe di interpretarlo come una funzione membro senza argomenti.
Vedere ad es. here o here per motivi di utilizzo comuni.

Nota che VC8s cl.exe si blocca regolarmente Boost.Bind abusi - in caso di dubbio utilizzare un test-case con gcc e probabilmente otterrete buone note come il modello di parametri Bind -internals sono stati istanziati con se leggi l'output.

+0

c'è qualche possibilità di dare una mano con questo http://stackoverflow.com/questions/13074756/how-to-avoid-static-member-function-when-using-gsl-with-c? è simile ma 'std :: function' restituisce un errore –

+0

Grazie, questo è un po 'confuso ma la tua risposta mi ha salvato la bacon! – portforwardpodcast

Problemi correlati