![](/img/trans.png)
[英]Is it possible to convert a const unique_ptr reference (derived class) to a shared_ptr (base class)
[英]Cannot convert from 'const shared_ptr<base_class>' to 'shared_ptr<derived_class>'
我聲明了以下vector
:
vector<shared_ptr<base_class> inventory;
我有以下變量:
shared_ptr<derived_class> equipped_item;
我正在嘗試執行以下操作:
equipped_item = inventory[0];
我收到以下錯誤:
Cannot convert from 'const shared_ptr<base_class>' to 'shared_ptr<derived_class>'
我的問題是,為什么我會不會被允許嘗試將設置equipped_item
在所選擇的項目vector
?
您正在嘗試將base
類轉換為derived
( 向下轉換的),它不能隱式轉換。 為此,您需要std::static_pointer_cast
(如果您確定要投射的內容)或std::dynamic_pointer_cast
(如果類是多態的),因為您已經使用了智能指針 。
例如,以下是std::static_pointer_cast
的示例代碼:
#include <iostream>
#include <vector>
#include <memory>
class base_class {};
class derived_class: public base_class {};
int main()
{
std::shared_ptr<derived_class> some_derived_ptr = std::make_shared<derived_class>();
std::vector<std::shared_ptr<base_class>> inventory{some_derived_ptr};
std::shared_ptr<derived_class>
equipped_item = std::static_pointer_cast<derived_class>(inventory[0]);
}
由於base_class
不能隱式轉換為derived_class
常規構造函數將無法工作。 您應該使用static_pointer_cast
(如果類不是多態的)或dynamic_poiner_cast
(如果類是多態的):
::std::vector<::std::shared_ptr<base_class>> pointers{::std::make_shared<derived_class>()};
::std::shared_ptr<derived_class> pd{::std::static_pointer_cast<derived_class>(pointers[0])};
請注意,需要從基類強制轉換為派生通常是不正確的類層次結構或接口使用不正確的標志。
您正在嘗試執行以下操作:
pointer_derived = pointer_base; //No implicit conversion possible.
但是,以下是可能的:
pointer_base = pointer_derived; // Possible.
嘗試顯式下調您的pointer_base。
pointer_derived = static_pointer_cast<Derived>(pointer_base);
//Since you know that pointer_base is pointing to a derived class here.
從cppreference ,從Y
到T
的shared_ptr
轉換構造函數“如果Y*
不能隱式轉換為T*
,則不參與重載解析”。 您正在執行從基本到派生的轉換,這需要static_cast
或dynamic_cast
,它不是隱式的。
您應該根據類定義使用指標類型為static_pointer_cast
或dynamic_pointer_cast
的指針 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.