分配
std::unique_ptr<boost::asio::io_service::work>
指向新的
boost::asio::io_service::work
对象
我正在转换
boost::asio
从使用静态函数和全局变量到类实现的代码,但这意味着我必须替换工作初始化:
std::unique_ptr<boost::asio::io_service::work> KeepAlive(
new boost::asio::io_service::work(TheASIOService));
类定义中包含类成员变量:
std::unique_ptr<boost::asio::io_service::work> KeepAlive;
稍后分配给新值:
KeepAlive = new boost::asio::io_service::work(IO_Service);
编译器根据参数类型(Boost错误的括号)拒绝:
g++ -std=c++0x -c -Wall ../comms/CommServer.cpp
../comms/CommServer.cpp: In member function âvoid CommServer::Listen()â:
../comms/CommServer.cpp:39:13: error: no match for âoperator=â (operand types are âstd::unique_ptr<boost::asio::io_service::work>â and âboost::asio::io_service::work*â)
KeepAlive = new boost::asio::io_service::work(IO_Service);
^
../comms/CommServer.cpp:39:13: note: candidates are:
In file included from /usr/include/c++/4.8/memory:81:0,
from /usr/include/boost/config/no_tr1/memory.hpp:21,
from /usr/include/boost/get_pointer.hpp:14,
from /usr/include/boost/bind/mem_fn.hpp:25,
from /usr/include/boost/mem_fn.hpp:22,
from /usr/include/boost/bind/bind.hpp:26,
from /usr/include/boost/bind.hpp:22,
from ../comms/Comms.h:16,
from ../comms/CommServer.h:16,
from ../comms/CommServer.cpp:10:
/usr/include/c++/4.8/bits/unique_ptr.h:190:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = boost::asio::io_service::work; _Dp = std::default_delete<boost::asio::io_service::work>]
operator=(unique_ptr&& __u) noexcept
^
/usr/include/c++/4.8/bits/unique_ptr.h:190:7: note: no known conversion for argument 1 from âboost::asio::io_service::work*â to âstd::unique_ptr<boost::asio::io_service::work>&&â
/usr/include/c++/4.8/bits/unique_ptr.h:203:2: note: template<class _Up, class _Ep> typename std::enable_if<std::__and_<std::is_convertible<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Tp, _Dp>::_Pointer::type>, std::__not_<std::is_array<_Up> > >::value, std::unique_ptr<_Tp, _Dp>&>::type std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = _Up; _Ep = _Ep; _Tp = boost::asio::io_service::work; _Dp = std::default_delete<boost::asio::io_service::work>]
operator=(unique_ptr<_Up, _Ep>&& __u) noexcept
^
/usr/include/c++/4.8/bits/unique_ptr.h:203:2: note: template argument deduction/substitution failed:
../comms/CommServer.cpp:39:13: note: mismatched types âstd::unique_ptr<_Tp, _Dp>â and âboost::asio::io_service::work*â
KeepAlive = new boost::asio::io_service::work(IO_Service);
^
In file included from /usr/include/c++/4.8/memory:81:0,
from /usr/include/boost/config/no_tr1/memory.hpp:21,
from /usr/include/boost/get_pointer.hpp:14,
from /usr/include/boost/bind/mem_fn.hpp:25,
from /usr/include/boost/mem_fn.hpp:22,
from /usr/include/boost/bind/bind.hpp:26,
from /usr/include/boost/bind.hpp:22,
from ../comms/Comms.h:16,
from ../comms/CommServer.h:16,
from ../comms/CommServer.cpp:10:
/usr/include/c++/4.8/bits/unique_ptr.h:211:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::nullptr_t) [with _Tp = boost::asio::io_service::work; _Dp = std::default_delete<boost::asio::io_service::work>; std::nullptr_t = std::nullptr_t]
operator=(nullptr_t) noexcept
^
/usr/include/c++/4.8/bits/unique_ptr.h:211:7: note: no known conversion for argument 1 from âboost::asio::io_service::work*â to âstd::nullptr_tâ
我检查了
documentation for the unique_ptr's assignment operator
并看到该示例出于某种原因在对
std::move()
,但编译器以类似的方式对此犹豫不决:
g++ -std=c++0x -c -Wall ../comms/CommServer.cpp
../comms/CommServer.cpp: In member function âvoid CommServer::Listen()â:
../comms/CommServer.cpp:39:13: error: no match for âoperator=â (operand types are âstd::unique_ptr<boost::asio::io_service::work>â and âstd::remove_reference<boost::asio::io_service::work*>::type {aka boost::asio::io_service::work*}â)
KeepAlive = std::move(new boost::asio::io_service::work(IO_Service));
^
../comms/CommServer.cpp:39:13: note: candidates are:
In file included from /usr/include/c++/4.8/memory:81:0,
from /usr/include/boost/config/no_tr1/memory.hpp:21,
from /usr/include/boost/get_pointer.hpp:14,
from /usr/include/boost/bind/mem_fn.hpp:25,
from /usr/include/boost/mem_fn.hpp:22,
from /usr/include/boost/bind/bind.hpp:26,
from /usr/include/boost/bind.hpp:22,
from ../comms/Comms.h:16,
from ../comms/CommServer.h:16,
from ../comms/CommServer.cpp:10:
/usr/include/c++/4.8/bits/unique_ptr.h:190:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = boost::asio::io_service::work; _Dp = std::default_delete<boost::asio::io_service::work>]
operator=(unique_ptr&& __u) noexcept
^
/usr/include/c++/4.8/bits/unique_ptr.h:190:7: note: no known conversion for argument 1 from âstd::remove_reference<boost::asio::io_service::work*>::type {aka boost::asio::io_service::work*}â to âstd::unique_ptr<boost::asio::io_service::work>&&â
/usr/include/c++/4.8/bits/unique_ptr.h:203:2: note: template<class _Up, class _Ep> typename std::enable_if<std::__and_<std::is_convertible<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Tp, _Dp>::_Pointer::type>, std::__not_<std::is_array<_Up> > >::value, std::unique_ptr<_Tp, _Dp>&>::type std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = _Up; _Ep = _Ep; _Tp = boost::asio::io_service::work; _Dp = std::default_delete<boost::asio::io_service::work>]
operator=(unique_ptr<_Up, _Ep>&& __u) noexcept
^
/usr/include/c++/4.8/bits/unique_ptr.h:203:2: note: template argument deduction/substitution failed:
../comms/CommServer.cpp:39:13: note: mismatched types âstd::unique_ptr<_Tp, _Dp>â and âstd::remove_reference<boost::asio::io_service::work*>::type {aka boost::asio::io_service::work*}â
KeepAlive = std::move(new boost::asio::io_service::work(IO_Service));
^
In file included from /usr/include/c++/4.8/memory:81:0,
from /usr/include/boost/config/no_tr1/memory.hpp:21,
from /usr/include/boost/get_pointer.hpp:14,
from /usr/include/boost/bind/mem_fn.hpp:25,
from /usr/include/boost/mem_fn.hpp:22,
from /usr/include/boost/bind/bind.hpp:26,
from /usr/include/boost/bind.hpp:22,
from ../comms/Comms.h:16,
from ../comms/CommServer.h:16,
from ../comms/CommServer.cpp:10:
/usr/include/c++/4.8/bits/unique_ptr.h:211:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::nullptr_t) [with _Tp = boost::asio::io_service::work; _Dp = std::default_delete<boost::asio::io_service::work>; std::nullptr_t = std::nullptr_t]
operator=(nullptr_t) noexcept
^
/usr/include/c++/4.8/bits/unique_ptr.h:211:7: note: no known conversion for argument 1 from âstd::remove_reference<boost::asio::io_service::work*>::type {aka boost::asio::io_service::work*}â to âstd::nullptr_tâ
阅读上的文档
std::move
,我发现有一些新的指针概念我不太熟悉,应该仔细阅读,但在那之前,我更希望
::work
对象
这是吗
unique_ptr
保护我不做会使担保失效的事?我不应该使用
唯一_ptr
在这里或者我只是没有正确的语法?我应该使用
unique_ptr::reset(new ...)
?