2010-06-01 3 views
1

Je veux que ce code fonctionne correctement, que dois-je faire?Question C++: boost :: bind recevoir autre boost :: bind

donnant cette erreur sur la dernière ligne.

qu'est-ce que je fais mal? je sais boost :: bind besoin d'un type mais je ne reçois pas. help

class A 
{ 

public: 

    template <class Handle> 
    void bindA(Handle h) 
    { 
     h(1, 2); 
    } 
}; 

class B 
{ 

    public: 
     void bindB(int number, int number2) 
     { 
      std::cout << "1 " << number << "2 " << number2 << std::endl; 
     } 
}; 


template < class Han > struct Wrap_ 
{ 

    Wrap_(Han h) : h_(h) {} 

    template<typename Arg1, typename Arg2> void operator()(Arg1 arg1, Arg2 arg2) 
    { 
     h_(arg1, arg2); 
    } 
    Han h_; 
}; 

template< class Handler > 

    inline Wrap_<Handler> make(Handler h) 
    { 
     return Wrap_<Handler> (h); 
    } 
int main() 
{ 

    A a; 
    B b; 
    ((boost::bind)(&B::bindB, b, _1, _2))(1, 2); 
    ((boost::bind)(&A::bindA, a, make(boost::bind(&B::bindB, b, _1, _2))))(); 
/*i want compiled success and execute success this code*/ 

} 

Répondre

1

Le problème que vous rencontrez est que vous essayez de lier à une fonction de modèle. Dans ce cas, vous devez spécifier le type de modèle de la méthode que vous appelez à lier. Ceci se produit pour la méthode A::bindA. Voir ci-dessous pour un fragment de code pour main qui compile correctement avec les classes fournies.

Incidemment dans l'exemple j'utilise boost::function (la bibliothèque soeur à lier) pour spécifier quel type de pointeurs de fonction sont utilisés. Je pense que cela le rend beaucoup plus lisible et vous recommande fortement de vous familiariser avec si vous allez continuer à utiliser bind.

#include "boost/bind.hpp" 
#include "boost/function.hpp" 

int main(int c, char** argv) 
{ 
    A a; 
    B b; 

    typedef boost::function<void(int, int)> BFunc; 
    typedef boost::function<void(BFunc)> AFunc; 
    BFunc bFunc(boost::bind(&B::bindB, b, _1, _2)); 
    AFunc aFunc(boost::bind(&A::bindA<BFunc>, a, make(bFunc))); 

    bFunc(1,2); 
} 
Questions connexes