Frage Sollte std :: bind mit boost :: asio kompatibel sein?


Ich versuche, eines der boost :: asio Beispiele anzupassen, um möglichst C ++ 11 / TR1-Bibliotheken zu verwenden. Der ursprüngliche Code sieht so aus:

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));
}

Wenn ich es ersetze boost::bind mit std::bind wie folgt:

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 ) );
}

Ich bekomme eine große Fehlermeldung, die endet mit:

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

Ich benutze GCC Version 4.4 mit Boost Version 1.47

Ich habe erwartet, dass boost :: bind und std :: bind austauschbar sind.


41
2018-01-19 10:04


Ursprung


Antworten:


Ich habe jetzt eine Lösung

Das Problem ist, dass wenn ich zuerst versuchte, zu wechseln std::bind und std::shared_ptr Ich benutzte immer noch die boost::asio::placeholders mit std::bindDies führte zu einer großen Anzahl von Vorlagen-Compiler-Fehlern, so dass ich dann versuchte, stückweise zu wechseln.

Ich habe zuerst versucht, nur zu wechseln boost::shared_ptr zu std::shared_ptr, das ist gescheitert, weil boost::bind wird nicht mit arbeiten std::shared_ptr ohne eine Spezialisierung der Vorlage get_pointer<typename T> zum std::shared_ptr (sehen: Wie löst man den Konflikt zwischen boost :: shared_ptr und std :: shared_ptr?).

Nach dem Wechsel zu std :: shared_ptr wechselte ich dann zu std::bind, diesmal mit dem std::placeholders, (danke Richard) der Beispielcode kompiliert jetzt und funktioniert korrekt.

Um zu verwenden std::bind mit boost::asio Stelle sicher das std::shared_ptr und das std::placeholders werden auch benutzt.


23
2018-03-02 16:40