2010-01-28 11 views
4

Je voudrais fournir une fonction boost :: extra à async_write. Je veux d'abord appeler la fonction HandleWrite propre aux connexions, puis appeler la fonction boost :: fournie.Boost :: lie une méthode avec boost :: function parameter

procédé Membre de connexion qui se lie à ASIO async_write

void Connection::HandleWrite(
    const boost::system::error_code& e, 
    boost::function<void (const boost::system::error_code&)> handler) 
{ 
    // Code removed for clarity 

    if(!handler.empty()) 
     handler(e); 
}; 

Essayer de se lier à un HandleWrite async_write asio et fournir une autre liaison que la valeur de gestionnaire. Cela ne compile pas. Qu'est-ce que je fais mal?

void Connection::QueueRequest(
     boost::shared_array<char> message, 
     std::size_t size, 
     boost::function<void (const boost::system::error_code&)> handler) 
    { 
    // Code hidden for clarity 

    boost::asio::async_write(m_Socket, boost::asio::buffer(buffer), 
     boost::bind(&Connection::HandleWrite, shared_from_this(), 
      boost::asio::placeholders::error, 
      handler 
     ) 
    ); 
    } 

Le message d'erreur que je reçois du compilateur est la suivante:

Error 1 error C2825: 'F': must be a class or namespace when followed by '::' boost\bind\bind.hpp 69 
Error 2 error C2039: 'result_type' : is not a member of '`global namespace'' boost\bind\bind.hpp 69 
Error 3 error C2146: syntax error : missing ';' before identifier 'type' boost\bind\bind.hpp 69 
Error 4 error C2208: 'boost::_bi::type' : no members defined using this type boost\bind\bind.hpp 69 
Error 5 fatal error C1903: unable to recover from previous error(s); stopping compilation boost\bind\bind.hpp 69 
+1

Il serait utile si vous avez fourni le message d'erreur –

+0

Je n'ai pas ajouté le message d'erreur ci-dessus. –

+0

Le problème s'est avéré être dans un autre endroit qui utilisait la même fonction HandleWrite et n'était pas lié correctement. Après avoir réparé cela compilé. –

Répondre

0

Le problème s'est produit à un autre endroit qui utilisait la même fonction HandleWrite et n'était pas lié correctement. Après avoir réparé cela compilé.

0

Quelle erreur (s) êtes-vous exactement? Je ne vois rien d'anormal dans le code indiqué dans votre question, donc je ne peux pas vous donner une réponse directe. Cependant, la réponse de Kornel m'a fait douter, car je pensais que les foncteurs générés par boost :: bind peuvent prendre n'importe quel nombre d'arguments et simplement ignorer les supplémentaires.

Je rapidement piraté ce pour vérifier:

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/shared_ptr.hpp> 
#include <boost/enable_shared_from_this.hpp> 
#include <boost/function.hpp> 
#include <string> 
#include <iostream> 


void Foo(const boost::system::error_code&) 
{ 
    // whatever 
} 

struct Client : boost::enable_shared_from_this<Client> 
{ 
    void HandleWrite(
     const boost::system::error_code& Err, 
     boost::function<void(const boost::system::error_code&)> OtherHandler 
    ) 
    { 
     std::cout << "MyHandler(" << Err << ")\n"; 
     OtherHandler(Err); 
    } 

    void MakeTheCall(boost::function<void (const boost::system::error_code&)> Other) 
    { 
     using boost::asio::ip::tcp; 

     // Of course, the scope and initialization of 
     // io_service, sock and request are all wrong here, 
     // as we're only interested in testing if the async_write 
     // call below will compile. 
     // Don't try to run this at home! 
     boost::asio::io_service io_service; 
     tcp::socket sock(io_service); 
     boost::asio::streambuf request; 

     boost::asio::async_write(sock, request, 
      boost::bind(&Client::HandleWrite, shared_from_this(), 
       boost::asio::placeholders::error, 
       Other 
      ) 
     ); 
    } 
}; 


int main() 
{ 
    boost::shared_ptr<Client> c; 
    c->MakeTheCall(boost::bind(&Foo, _1)); 

    return 0; 
} 

qui esquissait ce que je suppose que vous essayez de faire.

Comme prévu, il compile, donc le comparer avec ce que vous faites peut vous aider à trouver le problème.