【问题标题】:shared_pointer of a base class cannot be created using a polymorphic derived不能使用多态派生创建基类的 shared_pointer
【发布时间】:2011-10-10 09:44:20
【问题描述】:

我有一个基本多态类(带有虚拟方法)和一个派生自它。 我正在尝试使用以下代码

     boost::shared_ptr<base_class> ptr( new derived_class() );

但编译器返回以下错误

    cannot convert ‘fpga_northwest*’ to ‘fpga*’ in initialization
    make: *** [../obj/ixecute_cmd_interface.o] Error 1

环顾四周,我很想使用以下构建好的,但我有一些疑问。你觉得对吗?

     boost::shared_ptr<base_class> ptr_base;
     boost::shared_ptr<derived_class> ptr_derived( new derived_class() );
     ptr_base = boost::dynamic_pointer_cast<base_class>( ptr_derived );

如果我使用boost::static_pointer_cast,我会遇到编译器错误;因为我是从派生到基础的,所以static_cast 不应该更正确?

感谢您的帮助

【问题讨论】:

  • 试试dynamic_cast&lt;base_class&gt;(deriver_class object)
  • 不明白,这似乎工作正常:ideone.com/N63Qf
  • 嗯,this example 工作正常。你的代码有什么不同?
  • @Nim:当您使用私有继承时,您的示例无法编译。也许这就是 OP 做错了什么?
  • @Bjorn,这将报告一个不同的错误 AFAIK(类似于无法访问的基地......等等)。我认为任何演员也不会对此有所帮助..

标签: c++ casting shared-ptr


【解决方案1】:
boost::shared_ptr<base_class> ptr( new derived_class() );

这应该可以正常工作。

也许这些类毕竟不相关?

也许这些类在那个时候是不完整的,所以编译器不知道这些类是相关的? (不过,这也会产生其他错误。)

【讨论】:

  • 我会投票支持使用时类的不完整定义...+1
  • 您好,我需要检查一下 'cos derived_class 是否继承了 base_class 但它不起作用。
  • ..什么时候会发生?我无法理解,因为我在其他地方构建了一个示例,现在它构建了!?!?!
  • ...我检查过,你是对的...我的代码有错字!! :(
【解决方案2】:

这应该按照最初的说明工作。一个derived_class* 会很高兴地转换成一个base_class* 来构造shared_ptr。正如所指出的,ideone 也会编译它。我建议您的 Boost 安装或编译器有问题。

或者,正如所指出的,你的代码的其余部分。

【讨论】:

  • 实际上 shared_ptr 应该很乐意接受派生类指针作为参数,然后进行向上转换。
【解决方案3】:

需要类型强制才能执行此强制转换,这是通过成员模板实现的。这在较旧的编译器上没有得到很好的支持。因此,它在这些编译器上被禁用。你用的是什么编译器?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2015-08-10
    • 2014-09-29
    相关资源
    最近更新 更多