2010-02-20 4 views
67

Le code suivant provoque le blocage de cl.exe (MS VS2005).
Je suis en train d'utiliser bind coup de pouce pour créer une fonction à une appelle une méthode de maclasse:Comment utiliser boost bind avec une fonction membre

#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?

Répondre

89

Utilisez les commandes suivantes à la place:

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

Ce transmet le premier paramètre passé à l'objet de fonction à la fonction à l'aide place détenteurs - vous devez dire Boost.Bind comment gérer les paramètres. Avec votre expression, il essaierait de l'interpréter comme une fonction de membre ne prenant aucun argument.
Voir par ex. here ou here pour les modèles d'utilisation courants.

Notez que VC8s cl.exe tombe en panne régulièrement Boost.Bind mésusages - en cas de doute utiliser un test cas avec gcc et vous aurez probablement obtenir de bons conseils comme le modèle des paramètres Bind -internals ont été instanciées avec si vous lisez à travers la sortie.

+0

une chance que vous pouvez aider avec cela http://stackoverflow.com/questions/13074756/how-to-avoid-static-member-function-when-using-gsl-with-c? c'est similaire mais 'std :: function' donne une erreur –

+0

Merci, c'est un peu confus mais votre réponse m'a sauvé mon bacon! – portforwardpodcast

Questions connexes