2013-07-28 12 views
5

Reading this, mam wrażenie, że ten kod powinien działać:nie można używać obiektów ruchomych z Boost.Asio

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

ale problemy kompilatora ten błąd w konstruktora:

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

mam również zdefiniowane BOOST_ASIO_HAS_MOVE. Używam Xcode 4.6.3 i w ustawieniach kompilatora mam to określono:

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

Czy można wyświetlić kod, który wywołuje konstruktor 'Connecion'? –

+0

@Igor R: Mam inną klasę serwera, której używam w main(), ale klasa Connection nie jest używana nigdzie. Jest on właśnie zadeklarowany – Kobe

+1

. Otrzymujesz komunikat o błędzie dotyczącym wywoływania niejawnie usuniętego konstruktora kopiowania, ale żaden kod nie konstruuje obiektu 'Connection'? Czy kompilator podaje ślad miejsca utworzenia błędu? Ten problem pojawia się normalnie, gdy kod wywołujący konstruktor przekazuje gniazdo jako referencję rvalue, zamiast konwertowania go do xvalue za pomocą 'std :: move'. –

Odpowiedz

4

Trzeba mieć BOOST_ASIO_HAS_MOVE zdefiniowane przed tym nagłówki ASIO. Jeśli nie, przeniesienie wsparcia jest wyłączone. Zobacz asio/basic_stream_socket.hpp.

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

+0

Jawnie zdefiniowanie BOOST_ASIO_HAS_MOVE nie działa dla mnie. Musiałem zmodyfikować '/ usr/include/boost/asio/detail/config.hpp'. Dodałem "// Clang/libC++ detection" i zastąpiłem '// Konstrukcję i przypisanie ruchu wsparcia w kompilatorach znanych z tego, aby zezwalały na to" sekcje z tymi z: http://www.boost.org/doc/libs/ 1_55_0/boost/asio/detail/config.hpp – bitek

Powiązane problemy