Cómo usar Boost bind con una función miembro

El siguiente código hace que cl.exe se bloquee (MS VS2005).
Estoy tratando de usar boost bind para crear una función a las llamadas a un método de myclass:

#include "stdafx.h" #include  #include  #include  class myclass { public: void fun1() { printf("fun1()\n"); } void fun2(int i) { printf("fun2(%d)\n", i); } void testit() { boost::function f1( boost::bind( &myclass::fun1, this ) ); boost::function 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?

Use lo siguiente en su lugar:

 boost::function f2( boost::bind( &myclass::fun2, this, _1 ) ); 

Esto reenvía el primer parámetro que se pasa al objeto de función a la función que utiliza marcadores de posición: debe decirle a Boost.Bind cómo manejar los parámetros. Con su expresión, intentaría interpretarla como una función miembro sin argumentos.
Ver, por ejemplo, aquí o aquí para ver los patrones de uso común.

Tenga en cuenta que VC8s cl.exe se bloquea regularmente en Boost.Bind usos indebidos : si tiene dudas, utilice un caso de prueba con gcc y probablemente obtendrá buenos consejos como los parámetros de la plantilla Bind -internals se crearon instancias si lee a través de la salida.