81 votes

Comment utiliser boost bind avec une fonction membre

Le code suivant provoque le blocage de cl.exe (MS VS2005).
J'essaie d'utiliser boost bind pour créer une fonction à une méthode d'appels de myclass:

 #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'est-ce que je fais mal?

110voto

Georg Fritzsche Points 59185

Utilisez plutôt la syntaxe suivante:

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

Cela envoie le premier paramètre passé à la fonction de l'objet à la fonction à l'aide placez-les titulaires de vous dire Boost.Lier comment gérer les paramètres. Avec votre expression, il serait tenter de l'interpréter comme une fonction membre prenant pas d'argument.
Voir par exemple ici ou ici pour le commun des habitudes d'utilisation.

Notez que VC8s cl.exe régulièrement des plantages sur coup de pouce.Lier abuse - en cas de doute, utiliser un test avec gcc et vous aurez probablement obtenir de bons conseils comme les paramètres du modèle de Lier-internals ont été instancié avec si vous avez lu à travers la sortie.

23voto

Josh Townzen Points 927

Vous devez ajouter un espace réservé pour l'int que vous passez à f2 (). Si vous remplacez cette définition par:

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

alors il va compiler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X