2017-10-15 5 views
1

J'essaie de mapper une chaîne à une fonction. La fonction doit avoir un const char* passé. Je me demande pourquoi je continue à obtenir l'erreur queBooster la carte de fonction à la chaîne

*no match for call to ‘(boost::_bi::bind_t<boost::_bi::unspecified, void (*)(const char*), boost::_bi::list0>) (const char*)’* 

Mon code est ci-dessous

#include <map> 
#include <string> 
#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/function.hpp> 



typedef boost::function<void(const char*)> fun_t; 
typedef std::map<std::string, fun_t> funs_t; 



void $A(const char *msg) 
{ 
    std::cout<<"hello $A"; 
} 

int main(int argc, char **argv) 
{ 
    std::string p = "hello"; 
    funs_t f; 
    f["$A"] = boost::bind($A); 
    f["$A"](p.c_str()); 
    return 0; 
} 
+0

Je vous mets en garde contre l'utilisation d'identifiants non standards comme '$ A'. – StoryTeller

Répondre

1

Dans votre exemple, en utilisant boost::bind est tout à fait superflu. Vous pouvez simplement affecter la fonction elle-même (elle sera convertie en un pointeur vers une fonction, et sera effacée par boost::function).

Puisque vous liez, il ne suffit pas de passer la fonction. Vous devez donner boost::bind l'argument lors de la liaison, ou spécifier un espace réservé si vous souhaitez que l'objet lié transfère quelque chose à votre fonction. Vous pouvez le voir dans le message d'erreur, c'est ce que boost::_bi::list0 est là pour.

Donc, pour le résoudre:

f["$A"] = boost::bind($A, _1); 

Ou le plus simple

f["$A"] = $A; 

En outre, comme je vous noté dans le commentaire, je vous suggère d'éviter les identificateurs qui ne sont pas standard. Un $ n'est pas un jeton valide dans un identificateur selon la norme C++. Certaines implémentations peuvent le prendre en charge, mais toutes ne sont pas requises.