2010-02-20 20 views
67

El siguiente código hace que cl.exe se bloquee (MS VS2005).
Estoy tratando de impulsar el uso se unen para crear una función a una llama a un método de miclase:Cómo usar boost Boost con una función de miembro

#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; 
} 

¿Qué estoy haciendo mal?

Respuesta

89

Utilice el siguiente en su lugar:

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

Este reenvía el primer parámetro pasado al objeto de función a la función utilizando lugar titulares - usted tiene que decirle Boost.Bind cómo manejar los parámetros. Con su expresión, intentaría interpretarla como una función miembro sin argumentos.
Ver p. here o here para patrones de uso común.

Tenga en cuenta que VC8s cl.exe se estrella regularmente en Boost.Bind malos usos - en caso de duda utilizar un caso de prueba con gcc y es probable que obtener buenas pistas como la plantilla de parámetros de enlace -internals se instancian con si lees a través de la salida.

+0

¿hay alguna posibilidad de que pueda ayudarnos con esta http://stackoverflow.com/questions/13074756/how-to-avoid-static-member-function-when-using-gsl-with-c? es similar pero 'std :: function' da un error –

+0

¡Gracias, esto es bastante confuso pero tu respuesta salvó mi tocino! – portforwardpodcast

Cuestiones relacionadas