你如何正确使用boost :: make_shared_ptr?

时间:2010-03-11 05:57:32

标签: c++ visual-studio-2008 visual-c++ boost boost-asio

这个简单的例子无法在VS2K8中编译:

    io_service io2;
    shared_ptr<asio::deadline_timer> dt(make_shared<asio::deadline_timer>(io2, posix_time::seconds(20)));

就像这一样:

shared_ptr<asio::deadline_timer> dt = make_shared<asio::deadline_timer>(io2);

错误是:

  

错误C2664:'boost :: asio :: basic_deadline_timer :: basic_deadline_timer(boost :: asio :: io_service&amp;,const boost :: posix_time :: ptime&amp;)':无法从'const boost转换参数1: :asio :: io_service'到'boost :: asio :: io_service&amp;'

1 个答案:

答案 0 :(得分:7)

问题是asio::deadline_timer有一个构造函数,需要对服务进行非const引用。但是,当您使用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));

这将获取您的实例,并将其放入一个可以隐式转换为对您的isntance的引用的对象。然后,您基本上传递了一个对象,表示对您的实例的非const引用。

这是有效的,因为reference_wrapper确实存储了指向您实例的指针。因此,它可以在仍为const的情况下返回指针解除引用。