43 votes

std::bind doit-il être compatible avec boost::asio ?

J'essaie d'adapter l'un des exemples de boost::asio pour utiliser les bibliothèques c++11 / TR1 lorsque cela est possible. Le code original ressemble à ceci :

void start_accept()
{ 
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      boost::bind(&tcp_server::handle_accept, this, new_connection,
         boost::asio::placeholders::error));
}

Si je remplace boost::bind con std::bind comme suit :

void start_accept()
{ 
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      std::bind(&tcp_server::handle_accept, this, new_connection,
                 boost::asio::placeholders::error ) );
      // std::bind(&tcp_server::handle_accept, this, new_connection, _1 ) );
}

Je reçois un grand message d'erreur, qui se termine par :

/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'

J'utilise gcc version 4.4 avec boost version 1.47.

Je m'attendais à ce que boost::bind et std::bind soient interchangeables.

26voto

mark Points 2609

J'ai maintenant une solution

Le problème, c'est que lorsque j'ai essayé pour la première fois de passer à std::bind y std::shared_ptr J'utilisais toujours le boost::asio::placeholders con std::bind J'ai donc essayé de changer les choses au fur et à mesure.

J'ai d'abord essayé de changer juste boost::shared_ptr a std::shared_ptr ce qui a échoué parce que boost::bind ne fonctionnera pas avec std::shared_ptr sans une spécialisation du modèle get_pointer<typename T> para std::shared_ptr (voir : Comment résoudre le conflit entre boost::shared_ptr et l'utilisation de std::shared_ptr ? ).

Après être passé à std::shared_ptr, j'ai ensuite passé à std::bind cette fois en utilisant le std::placeholders (merci Richard) le code d'exemple se compile maintenant et fonctionne correctement.

Afin d'utiliser std::bind con boost::asio s'assurer que std::shared_ptr y el std::placeholders sont également utilisés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X