我声明了以下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
中的所选项目?
答案 0 :(得分:2)
您正在尝试将base
类转换为不可隐式转换的derived
(down-cast)。为此,您需要std::static_pointer_cast
(如果您确定要转换的内容)或std::dynamic_pointer_cast
(如果类是多态的),就像使用smart pointers一样。>
例如,以下是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]);
}
答案 1 :(得分:1)
由于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])};
请注意,从基类强制转换为派生类通常是不正确的类层次结构或接口使用不正确的征兆。
答案 2 :(得分: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.
答案 3 :(得分:0)
从cppreference到shared_ptr
到Y
的{{1}}转换构造函数“如果T
不能隐式转换为{ {1}}”。您正在执行从Y*
或T*
的从基数到派生的转换,它不是隐式的。
您应该根据自己的类定义使用static_cast
或dynamic_cast
pointer cast。