In an application using C++11 and Boost.Asio, I came to use lambda functions and an std::unique_ptr
.
I want to transfer the ownership of this unique_ptr to a lambda.
You can't capture the unique_ptr by value as this class doesn't provide a copy constructor.
It is also silly to capture it by reference, as I do want the transfer of ownership.
I decided to use std::bind
to pass this unique_ptr
as a last parameter of this lambda function. I use std::move
to give an r-value reference to this lambda. Later I will move this r-value into a std::unique_ptr
(local to the lambda). I am stuck with some horrible gcc errors, and wonder what I missed in my code.
Here is the code that contains my ugly non-working trick:
void NetworkClient::start()
{
// Avoid the naggle algorithm on packets.
ip::tcp::no_delay optionNoDelay(true);
socket_.set_option(optionNoDelay);
// Lambda function that receive a packet header.
std::function<void (const boost::system::error_code& error, std::size_t bytesTransfered)> receiveHeaderHandler =
[this, &receiveHeaderHandler] (const boost::system::error_code& error, std::size_t bytesTransfered)
{
if (error)
{
std::cout << LogType::ERROR << "Error while receiving a packet header" << std::endl;
}
if (bytesTransfered < 6)
{
std::cout << LogType::ERROR << "Invalid packet received: header size < 6" << std::endl;
}
std::cout << "Packet received" << std::endl;
// Allocate memory for the incoming packet body.
std::unique_ptr<char[]> packetBody(new char[currentHeader_.size()]);
// Let's receive the packet body according to the header.
socket_.async_receive(buffer(packetBody.get(), currentHeader_.size()), std::bind
([this, &receiveHeaderHandler] (boost::system::error_code const & error, std::size_t bytesTransfered, std::unique_ptr<char[]> && arg)
{
if (error)
{
std::cout << LogType::ERROR << "Error while receiving a packet header" << std::endl;
}
if (bytesTransfered < currentHeader_.size())
{
std::cout << LogType::ERROR << "Invalid packet received: size of packet < size from header" << std::endl;
}
std::unique_ptr<char[]> packetBody(arg);
socket_.async_receive(buffer(currentHeader_.data(), 6), receiveHeaderHandler);
}, std::placeholders::_1, std::placeholders::_2, std::move(packetBody)));
};
socket_.async_receive(buffer(currentHeader_.data(), 6), receiveHeaderHandler);
}
Here is the trimmed and cleaned buggy part:
// Allocate memory for the incoming packet body.
std::unique_ptr<char[]> packetBody(new char[20]);
// Let's receive the packet body according to the header.
socket_.async_receive(asio::buffer(packetBody.get(), 20), std::bind(
[] (boost::system::error_code const & error, std::size_t bytesTransfered, std::unique_ptr<char[]> && arg)
{
std::unique_ptr<char[]> packetBody(arg);
}, std::placeholders::_1, std::placeholders::_2, std::move(packetBody)));
In this code:
- packetBody is the std::unique_ptr i want to transfer
- the async_receive handler must looks like
void handler(const boost::system::error_code& error,std::size_t bytes_transferred);
- the design looks ugly but i wanted to try c++11 lambdas in depth
Here is my gcc output:
In file included from /usr/include/boost/asio.hpp:30:0,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/basic_stream_socket.hpp: In instantiation of 'void boost::asio::basic_stream_socket<Protocol, StreamSocketService>::async_receive(const MutableBufferSequence&, ReadHandler&&) [with MutableBufferSequence = boost::asio::mutable_buffers_1; ReadHandler = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>; Protocol = boost::asio::ip::tcp; StreamSocketService = boost::asio::stream_socket_service<boost::asio::ip::tcp>]':
server/network/network-client.cpp:56:70: required from here
/usr/include/boost/asio/basic_stream_socket.hpp:518:64: error: use of deleted function 'std::_Bind<_Functor(_Bound_args ...)>::_Bind(const std::_Bind<_Functor(_Bound_args ...)>&) [with _Functor = oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>; _Bound_args = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::_Bind<_Functor(_Bound_args ...)> = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/boost/system/error_code.hpp:23:0,
from /usr/include/boost/asio/io_service.hpp:25,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:19,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/c++/4.7/functional:1199:7: note: 'std::_Bind<_Functor(_Bound_args ...)>::_Bind(const std::_Bind<_Functor(_Bound_args ...)>&) [with _Functor = oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>; _Bound_args = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::_Bind<_Functor(_Bound_args ...)> = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]' is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/4.7/functional:1199:7: error: use of deleted function 'constexpr std::tuple< <template-parameter-1-1> >::tuple(const std::tuple< <template-parameter-1-1> >&) [with _Elements = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::tuple< <template-parameter-1-1> > = std::tuple<std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> > >]'
In file included from /usr/include/c++/4.7/functional:56:0,
from /usr/include/boost/system/error_code.hpp:23,
from /usr/include/boost/asio/io_service.hpp:25,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:19,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/c++/4.7/tuple:393:17: note: 'constexpr std::tuple< <template-parameter-1-1> >::tuple(const std::tuple< <template-parameter-1-1> >&) [with _Elements = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::tuple< <template-parameter-1-1> > = std::tuple<std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> > >]' is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/4.7/tuple:393:17: error: use of deleted function 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const std::_Tuple_impl<_Idx, _Head, _Tail ...>&) [with long unsigned int _Idx = 0ul; _Head = std::_Placeholder<1>; _Tail = {std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::_Tuple_impl<_Idx, _Head, _Tail ...> = std::_Tuple_impl<0ul, std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> > >]'
/usr/include/c++/4.7/tuple:250:17: note: 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const std::_Tuple_impl<_Idx, _Head, _Tail ...>&) [with long unsigned int _Idx = 0ul; _Head = std::_Placeholder<1>; _Tail = {std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::_Tuple_impl<_Idx, _Head, _Tail ...> = std::_Tuple_impl<0ul, std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> > >]' is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/4.7/tuple:250:17: error: use of deleted function 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const std::_Tuple_impl<_Idx, _Head, _Tail ...>&) [with long unsigned int _Idx = 1ul; _Head = std::_Placeholder<2>; _Tail = {std::unique_ptr<char [], std::default_delete<char []> >}; std::_Tuple_impl<_Idx, _Head, _Tail ...> = std::_Tuple_impl<1ul, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> > >]'
/usr/include/c++/4.7/tuple:250:17: note: 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const std::_Tuple_impl<_Idx, _Head, _Tail ...>&) [with long unsigned int _Idx = 1ul; _Head = std::_Placeholder<2>; _Tail = {std::unique_ptr<char [], std::default_delete<char []> >}; std::_Tuple_impl<_Idx, _Head, _Tail ...> = std::_Tuple_impl<1ul, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> > >]' is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/4.7/tuple:250:17: error: use of deleted function 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const std::_Tuple_impl<_Idx, _Head, _Tail ...>&) [with long unsigned int _Idx = 2ul; _Head = std::unique_ptr<char []>; _Tail = {}; std::_Tuple_impl<_Idx, _Head, _Tail ...> = std::_Tuple_impl<2ul, std::unique_ptr<char [], std::default_delete<char []> > >]'
/usr/include/c++/4.7/tuple:250:17: note: 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const std::_Tuple_impl<_Idx, _Head, _Tail ...>&) [with long unsigned int _Idx = 2ul; _Head = std::unique_ptr<char []>; _Tail = {}; std::_Tuple_impl<_Idx, _Head, _Tail ...> = std::_Tuple_impl<2ul, std::unique_ptr<char [], std::default_delete<char []> > >]' is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/4.7/tuple:250:17: error: use of deleted function 'std::_Head_base<2ul, std::unique_ptr<char []>, false>::_Head_base(const std::_Head_base<2ul, std::unique_ptr<char []>, false>&)'
/usr/include/c++/4.7/tuple:122:12: note: 'std::_Head_base<2ul, std::unique_ptr<char []>, false>::_Head_base(const std::_Head_base<2ul, std::unique_ptr<char []>, false>&)' is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/4.7/tuple:122:12: error: use of deleted function 'std::unique_ptr<_Tp [], _Dp>::unique_ptr(const std::unique_ptr<_Tp [], _Dp>&) [with _Tp = char; _Dp = std::default_delete<char []>; std::unique_ptr<_Tp [], _Dp> = std::unique_ptr<char []>]'
In file included from /usr/include/c++/4.7/memory:86:0,
from /usr/include/boost/asio/detail/shared_ptr.hpp:21,
from /usr/include/boost/asio/detail/socket_ops.hpp:21,
from /usr/include/boost/asio/detail/socket_holder.hpp:20,
from /usr/include/boost/asio/detail/reactive_socket_accept_op.hpp:24,
from /usr/include/boost/asio/detail/reactive_socket_service.hpp:30,
from /usr/include/boost/asio/datagram_socket_service.hpp:26,
from /usr/include/boost/asio/basic_datagram_socket.hpp:21,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/c++/4.7/bits/unique_ptr.h:414:7: error: declared here
In file included from /usr/include/boost/asio/impl/io_service.hpp:18:0,
from /usr/include/boost/asio/io_service.hpp:767,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:19,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/detail/handler_type_requirements.hpp:83:8: error: initializing argument 1 of 'char (& boost::asio::detail::two_arg_handler_test(Handler, ...))[2] [with Handler = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/boost/asio.hpp:30:0,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/basic_stream_socket.hpp:515:5: error: static assertion failed: ReadHandler type requirements not met
/usr/include/boost/asio/basic_stream_socket.hpp:515:57: error: use of deleted function 'std::_Bind<_Functor(_Bound_args ...)>::_Bind(const std::_Bind<_Functor(_Bound_args ...)>&) [with _Functor = oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>; _Bound_args = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::_Bind<_Functor(_Bound_args ...)> = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/boost/asio/impl/io_service.hpp:18:0,
from /usr/include/boost/asio/io_service.hpp:767,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:19,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/detail/handler_type_requirements.hpp:95:26: error: initializing argument 1 of 'T& boost::asio::detail::lvref(T) [with T = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/boost/asio.hpp:30:0,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/basic_stream_socket.hpp:515:57: error: use of deleted function 'std::_Bind<_Functor(_Bound_args ...)>::_Bind(const std::_Bind<_Functor(_Bound_args ...)>&) [with _Functor = oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>; _Bound_args = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::_Bind<_Functor(_Bound_args ...)> = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/boost/asio/impl/io_service.hpp:18:0,
from /usr/include/boost/asio/io_service.hpp:767,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:19,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/detail/handler_type_requirements.hpp:96:32: error: initializing argument 1 of 'const T& boost::asio::detail::clvref(T) [with T = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/boost/asio.hpp:30:0,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/basic_stream_socket.hpp:515:57: error: use of deleted function 'std::_Bind<_Functor(_Bound_args ...)>::_Bind(const std::_Bind<_Functor(_Bound_args ...)>&) [with _Functor = oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>; _Bound_args = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}; std::_Bind<_Functor(_Bound_args ...)> = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/boost/asio/impl/io_service.hpp:18:0,
from /usr/include/boost/asio/io_service.hpp:767,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:19,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/boost/asio/detail/handler_type_requirements.hpp:97:28: error: initializing argument 1 of 'char boost::asio::detail::argbyv(T) [with T = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
In file included from /usr/include/c++/4.7/functional:56:0,
from /usr/include/boost/system/error_code.hpp:23,
from /usr/include/boost/asio/io_service.hpp:25,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:19,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/c++/4.7/tuple: In instantiation of 'constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 2ul; _Head = std::unique_ptr<char []>]':
/usr/include/c++/4.7/tuple:241:44: recursively required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const _Head&, const _Tail& ...) [with long unsigned int _Idx = 1ul; _Head = std::_Placeholder<2>; _Tail = {std::unique_ptr<char [], std::default_delete<char []> >}]'
/usr/include/c++/4.7/tuple:241:44: required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(const _Head&, const _Tail& ...) [with long unsigned int _Idx = 0ul; _Head = std::_Placeholder<1>; _Tail = {std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}]'
/usr/include/c++/4.7/tuple:384:33: required from 'constexpr std::tuple< <template-parameter-1-1> >::tuple(const _Elements& ...) [with _Elements = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}]'
/usr/include/c++/4.7/functional:1196:70: required from 'std::_Bind<_Functor(_Bound_args ...)>::_Bind(_Functor&&, _Args&& ...) [with _Args = {const std::_Placeholder<1>&, const std::_Placeholder<2>&, std::unique_ptr<char [], std::default_delete<char []> >&}; _Functor = oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>; _Bound_args = {std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char [], std::default_delete<char []> >}]'
/usr/include/c++/4.7/functional:1527:42: required from 'typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type std::bind(_Func&&, _BoundArgs&& ...) [with _Func = oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>; _BoundArgs = {const std::_Placeholder<1>&, const std::_Placeholder<2>&, std::unique_ptr<char [], std::default_delete<char []> >&}; typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type = std::_Bind<oroshi::network::NetworkClient::start()::<lambda(const boost::system::error_code&, std::size_t)>::<lambda(const boost::system::error_code&, std::size_t, std::unique_ptr<char []>&)>(std::_Placeholder<1>, std::_Placeholder<2>, std::unique_ptr<char []>)>]'
server/network/network-client.cpp:56:69: required from here
/usr/include/c++/4.7/tuple:128:25: error: use of deleted function 'std::unique_ptr<_Tp [], _Dp>::unique_ptr(const std::unique_ptr<_Tp [], _Dp>&) [with _Tp = char; _Dp = std::default_delete<char []>; std::unique_ptr<_Tp [], _Dp> = std::unique_ptr<char []>]'
In file included from /usr/include/c++/4.7/memory:86:0,
from /usr/include/boost/asio/detail/shared_ptr.hpp:21,
from /usr/include/boost/asio/detail/socket_ops.hpp:21,
from /usr/include/boost/asio/detail/socket_holder.hpp:20,
from /usr/include/boost/asio/detail/reactive_socket_accept_op.hpp:24,
from /usr/include/boost/asio/detail/reactive_socket_service.hpp:30,
from /usr/include/boost/asio/datagram_socket_service.hpp:26,
from /usr/include/boost/asio/basic_datagram_socket.hpp:21,
from /usr/include/boost/asio.hpp:20,
from server/network/./network-client.hpp:4,
from server/network/network-client.cpp:1:
/usr/include/c++/4.7/bits/unique_ptr.h:414:7: error: declared here