2013-07-28 4 views
5

lettura this, ho avuto l'impressione che questo codice dovrebbe funzionare:Impossibile utilizzare oggetti mobili con Boost.Asio

class Connection : public std::enable_shared_from_this<Connection> 
{ 
public: 
    Connection(tcp::socket&& socket) : socket_(std::move(socket)) {} 
private: 
    tcp::socket socket_; 
}; 

ma le questioni compilatore questo errore nel costruttore:

Call to implicitly-deleted copy constructor of 'tcp::socket' (aka'basic_stream_socket<boost::asio::ip::tcp>') 

ho anche definito BOOST_ASIO_HAS_MOVE. Io uso Xcode 4.6.3 e nelle impostazioni del compilatore ho questo definito:

C++ Language dialect: GNU++11[-std=gnu++11] 
C++ Standard Library: libc++(LLVM C++ standard library with C++11 support) 
+2

Potrebbe mostrare il codice che chiama 'costruttore Connecion'? –

+0

@Igor R: Ho un'altra classe server che uso in main(), ma la classe Connection non è utilizzata da nessuna parte. È appena dichiarato – Kobe

+1

Quindi si sta verificando un errore nel chiamare un costruttore di copie cancellato in modo implicito, ma nessun codice costruisce un oggetto 'Connection'? Il compilatore fornisce una traccia di dove è stato istanziato l'errore? Questo problema si manifesta normalmente quando il codice che chiama il costruttore passa il socket come riferimento di rvalore, piuttosto che convertirlo in un valore x tramite 'std :: move'. –

risposta

4

È necessario avere BOOST_ASIO_HAS_MOVE definito prima di includere le intestazioni ASIO. Se non lo fai, sposta il supporto è disabilitato. Vedi asio/basic_stream_socket.hpp.

https://svn.boost.org/trac/boost/ticket/8959

+0

Definire esplicitamente BOOST_ASIO_HAS_MOVE non ha funzionato per me. Ho dovuto modificare '/ usr/include/boost/asio/detail/config.hpp'. Ho aggiunto '// Clang/libC++ detection' e sostituito' // Support move construction and assignment su compilatori noti per consentirle. Sezioni con quelle da: http://www.boost.org/doc/libs/ 1_55_0/boost/ASIO/detail/config.hpp – bitek