【问题标题】:Boost shared_ptr passing a derived classBoost shared_ptr 传递一个派生类
【发布时间】:2013-06-04 16:05:31
【问题描述】:

所以我有类似的东西

class baseclass {
....
}

class derived : public baseclass {
...
}

void func(boost::shared_ptr<baseclass>& a){
//stuff
}

boost::shared_ptr<derived> foo;

func(foo);

这行得通吗?我假设不是因为它的类型不同,但是我没有能力将其转换为正确的类型,那么您能想到的任何解决方法可以使这项工作有效吗?

编辑:据我所知,我无法进行强制转换的原因是因为我正在对 boost::shared_ptr&lt;derived&gt; 类型的向量进行排序,所以我只使用 vec.begin() 和 vec.end() 调用 sort

【问题讨论】:

    标签: c++ boost shared-ptr derived-class


    【解决方案1】:

    只要T* 可以隐式转换为U*shared_ptr&lt;T&gt; 就可以隐式转换为shared_ptr&lt;U&gt;。特别是,shared_ptr&lt;T&gt; 可以隐式转换为shared_ptr&lt;T const&gt;shared_ptr&lt;U&gt;,其中 U 是T 的可访问基数,以及shared_ptr&lt;void&gt;

    http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm#Members

    不过,正如您现在的代码一样,它不会工作。 boost::shared_ptr&lt;baseclass&gt; 对象的隐式构造必须绑定到 const 引用,或者被复制以在构造之外持续存在。

    可以考虑

    void func(boost::shared_ptr&lt;baseclass&gt; a)

    void func(const boost::shared_ptr&lt;baseclass&gt;&amp; a)

    【讨论】:

    • 对不起,我的代码中确实有 const 我只是没有把它放在这里。
    • 使用 const& 它可以工作,但是请注意它涉及临时性,因此与匹配类型不同,它会增加/减少引用计数。
    【解决方案2】:

    是的,它会起作用的。直接编译会不会比在这里问更快?

    shared_ptr 有一个模板化的转换构造函数,当(且仅当)D* 可隐式转换为 B* 时,它允许从 shared_ptr&lt;D&gt;shared_ptr&lt;B&gt; 的隐式转换

    【讨论】:

    • 但是临时创建的这种方式会愉快地绑定到 & 吗?
    • 它是否在幕后进行动态转换来实现这一目标?那么它会进行类型检查还是静态转换?
    • @BalogPal,哎呀,我错过了&amp;,尽管对另一个答案的评论表明它是const&amp;,所以临时可以工作
    • @legion,这是一个隐式转换,您不需要对派生到基础的转换进行类型检查,它始终有效!
    【解决方案3】:

    我会感到非常惊讶。您需要传递正确类型的左值。为此,该类应该是基类,但事实并非如此。

    注意:如果您的函数将按值或 const& 获取 ptr,则将适用其他规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多