Проблема в том, что asio::deadline_timer
имеет конструктор, который требует неконстантной ссылки на службу. Однако, когда вы используете make_shared
, его параметр равен const
. То есть эта часть make_shared
является проблемой:
template< class T, class A1 > // service is passed by const-reference
boost::shared_ptr< T > make_shared( A1 const & a1 )
{
// ...
::new( pv ) T( a1 ); // but the constructor requires a non-const reference
// ...
}
Что вы можете сделать, это превратить службу в reference_wrapper
, используя ref
:
#include <boost/ref.hpp>
asio::io_service io1;
shared_ptr<asio::deadline_timer> dt = // pass a "reference"
make_shared<asio::deadline_timer>(boost::ref(io1));
Это берет ваш экземпляр и помещает его в объект, который может быть неявно преобразован в ссылку на ваше происхождение. Затем вы по существу передали объект , представляющий неконстантную ссылку на ваш экземпляр.
Это работает, потому что reference_wrapper
действительно хранит указатель на ваш экземпляр. Поэтому он может возвратить этот указатель разыменованным, оставаясь при этом const
.