簡體   English   中英

通過共享類來增強shared_ptr

[英]Boost shared_ptr passing a derived class

所以我有這樣的事情

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

只要T*可以隱式轉換為U*就可以將shared_ptr<T>隱式轉換為shared_ptr<U> 特別是, shared_ptr<T>可以隱式轉換為shared_ptr<T const> ,也可以隱式轉換為shared_ptr<T const> shared_ptr<U> ,其中U是T的可訪問基數,也可以隱式轉換為shared_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)

是的,它將起作用。 只是編譯它比在這里問要快嗎?

shared_ptr具有模板化的轉換構造函數,該構造函數允許在(且僅當) D*可隱式轉換為B*shared_ptr<D>shared_ptr<B>隱式轉換B*

我會非常驚訝。 您需要傳遞適當類型的左值。 為此,該類應該是基類,事實並非如此。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM