J'ai un problème probablement simple, embarassingly: passer et appeler une fonction membre dans une classe. Je sais que je veux utiliser BOOST bind (et ou function), mais je n'ai pas encore vraiment compris le concept.Pass et appeler une fonction membre (boost :: bind/boost :: fonction?)
Le code suivant compile et exécute avec le problème. Mais quand je veux changer la fonction "f3" à une fonction de classe non-statique, le plaisir commence:
#include <iostream>
#include <inttypes.h>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class Test
{
public:
void f1();
private:
void f2(void (*callfunc)(uint32_t));
static void f3(uint32_t x);
};
void Test::f1(){
f2(f3);
}
void Test::f2(void (*callfunc)(uint32_t)){
(*callfunc)(42);
}
void Test::f3(uint32_t x){
std::cout << "x: " << x << std::endl;
}
int main(int argc, char ** argv)
{
Test ct;
ct.f1();
return 0;
}
Maintenant, après avoir changé
static void f3(uint32_t x);
à
void f3(uint32_t x);
le compilateur n'est pas heureux et me dit « erreur: aucune fonction de mise en correspondance pour l'appel à « test :: f2() » »
Après avoir lu e un certain nombre de messages SO concernant boost :: bind et boost :: function, je pense que je dois changer la définition de f2() et comment f1() appelle f2() en donnant f3() comme cible à appeler, mais à part que ... à propos de chaque combinaison de boost :: bind et boost fonction que j'ai essayé lamentablement de ne pas compiler.
Comment ai-je besoin d'écrire cela? En guise de question supplémentaire: y a-t-il de simples introductions sur boost :: bind et boost :: function? Les docs BOOST ne m'a pas vraiment aidé là-bas.
B.
Vous avez fait votre correction j'étais sur le point de vous dire de faire – CashCow
@CashCow: Oui, juste pris il y a quelques minutes puisque je ne l'ai pas fait compiler ceci. – Jon
Si je pouvais, j'accepterais aussi votre réponse car elle contient le lien vers l'introduction du foncteur. La réponse de CashCow était un peu plus complète mais avec la signature de f2() (ce qui était assez clair pour moi à partir de votre réponse, mais peut-être pas pour d'autres). En tout cas, merci beaucoup pour la réponse et le lien. – BaCh