Est-ce que std :: bind devrait être compatible avec boost :: asio?

J’essaie d’adapter l’un des exemples boost :: asio pour utiliser les bibliothèques c ++ 11 / TR1 dans la mesure du possible. Le code d’origine 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 par 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 gros message d’erreur, avec des fins avec:

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

J’utilise la version 4.4 de gcc avec boost version 1.47

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

J’ai maintenant une solution

Le problème est que lorsque j’ai essayé de passer à std::bind et std::shared_ptr j’utilisais toujours le boost::asio::placeholders avec std::bind , ce qui entraînait une grande quantité d’erreurs de compilation du modèle, donc J’ai ensuite essayé de changer de pièce.

J’ai d’abord essayé de changer simplement boost::shared_ptr en std::shared_ptr , ceci a échoué parce que boost::bind ne fonctionnera pas avec std::shared_ptr sans une spécialisation du modèle get_pointer pour std::shared_ptr (voir: Comment résoudre les conflits entre boost :: shared_ptr et utiliser std :: shared_ptr? ).

Après être passé à std :: shared_ptr, je suis ensuite passé à std::bind , cette fois en utilisant std::placeholders , (merci richard) l’exemple de code comstack maintenant et fonctionne correctement.

Pour utiliser std::bind avec boost::asio assurez-vous que std::shared_ptr et std::placeholders sont également utilisés.