2010-03-11 47 views
2

這個簡單的例子未能在VS2K8編譯:你如何正確使用boost :: make_shared_ptr?

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:「提高:: ASIO :: basic_deadline_timer :: basic_deadline_timer(boost :: asio :: io_service &,const boost :: posix_time :: ptime &)':不能將參數1從'const boost :: asio :: io_服務」到‘的boost :: ASIO :: io_service對象&’

回答

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)); 

這需要您的實例,並把它變成一個可以隱式轉換爲對象的引用的對象。然後你基本上通過一個代表的對象,代表對你的實例的非const引用。

這是有效的,因爲reference_wrapper確實存儲了一個指向您的實例的指針。因此它可以返回指針,但仍然是const

+0

非常好,謝謝!不知道有關boost :: ref。部分原因是爲了避開這種類型的東西,還是有其他用途? – ApplePieIsGood 2010-03-11 14:07:45

+0

@蘋果:它的設計非常出於這個原因。例如,'boost :: thread'會爲新線程創建一個參數副本,但是如果您想實際傳遞一個參考'boost :: ref',那麼它也可以在那裏工作。它用於任何時候你想傳遞一個引用,但函數打算做一個副本。 – GManNickG 2010-03-11 18:08:56