2013-06-04 60 views
2

所以我有一些像這樣升壓shared_ptr的傳遞一個派生類

class baseclass { 
.... 
} 

class derived : public baseclass { 
... 
} 

void func(boost::shared_ptr<baseclass>& a){ 
//stuff 
} 

boost::shared_ptr<derived> foo; 

func(foo); 

將這項工作?我認爲不是因爲它不是同一類型,但是我不具備將它轉換爲正確類型的能力,那麼是否有任何解決方法可以使這項工作成爲可能?

編輯:我不能做演員就我所知的原因是因爲我上boost::shared_ptr<derived>類型的向量做一個排序,所以我只能用vec.begin()和vec.end()

調用排序

回答

4

shared_ptr<T>可以隱式轉換爲shared_ptr<U>只要T*可以隱式轉換爲U*。具體而言,shared_ptr<T>可以隱式轉換爲shared_ptr<T const>shared_ptr<U>,其中U是可訪問的基址Tshared_ptr<void>

http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm#Members

由於你的代碼是現在,雖然,它不會工作。 boost::shared_ptr<baseclass>對象的隱式構造必須綁定到一個const引用,或者被複制以保持超出構造。

考慮要麼

void func(boost::shared_ptr<baseclass> a)

void func(const boost::shared_ptr<baseclass>& a)

+0

對不起,我其實在我的代碼中有const,我只是沒有把它放在這裏。 – csteifel

+0

使用const&it時,請注意,它與臨時匹配類型不同,因此會顛倒refcount。 –

1

是的,它會工作。難道僅僅編譯它比在這裏問問題更快嗎?

shared_ptr有一個模板轉換構造,允許隱式轉換從shared_ptr<D>shared_ptr<B>如果(且僅當)D*隱式轉換爲B*

+0

但會臨時創建這種方式愉快地綁定到&? –

+0

它是否做了一個動態演員蓋下來實現這一目標?所以它會做類型檢查,或者它是一個靜態演員? – csteifel

+0

@BalogPal,oops,我錯過了'&',儘管對另一個答案的評論表明它是一個'const&',所以臨時工作將會起作用 –

1

我會非常驚訝。你需要傳遞正確類型的左值。爲了這個工作,這個類應該是基類,事實並非如此。

注意:如果您的函數將採用ptr值或const &其他規則將適用。