无法从'const shared_ptr <base_class>'转换为'shared_ptr <derived_class>'

时间:2018-06-23 06:13:24

标签: c++ class c++11 smart-pointers stdvector

我声明了以下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中的所选项目?

4 个答案:

答案 0 :(得分:2)

您正在尝试将base类转换为不可隐式转换的deriveddown-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)

cppreferenceshared_ptrY的{​​{1}}转换构造函数“如果T不能隐式转换为{ {1}}”。您正在执行从Y*T*的从基数到派生的转换,它不是隐式的。

您应该根据自己的类定义使用static_castdynamic_cast pointer cast