如何从作为同一模板实例的父类调用方法[boost :: enable_shared_from_this]

时间:2015-04-01 21:19:53

标签: c++ boost

我有以下代码。

class A: public boost::enable_shared_from_this<A> {
  public:
    virtual ~A() {}
    boost::shared_ptr<A> returnMe() {
      return shared_from_this();
    }
};

class B: public A, public boost::enable_shared_from_this<B> {
    boost::shared_ptr<B> returnMe() {
      return shared_from_this();
    }
};

gcc抱怨shared_from_this不明确。 *在这种情况下,使用boost::enable_shared_from_this<B>::shared_from_this()或是否安全 this->boost::enable_shared_from_this<B>::shared_from_this() 在B的回归? * A和B都从enable_shared_from_this继承了不同的参数。看起来好吗?或者我还需要做点什么? 如果B未继承enable_shared_from_this,则在B中使用shared_from_this()会返回shared_ptr<A>。如果是这样,static_pointer_cast shared_ptr<B>是否安全?

2 个答案:

答案 0 :(得分:1)

您是否尝试过更改为return enable_shared_from_this<B>::shared_from_this();

答案 1 :(得分:1)

有两个基础提供shared_from_this,但基础的类型是不同的,因此您可以使用它来消除歧义:

shared_ptr<B> returnMe() {
   return static_cast<boost::enable_shared_from_this<B>*>(this)->shared_from_this();
}

话虽这么说,设计可能比你想要的要复杂一点,特别是returnMe不是虚函数(并且不能是,不同的非协变返回类型),这意味着如果你将B传递给一个带有A引用或指针的函数,然后调用shared_from_this()它将获得该对象的错误的版本。

虽然shared_ptr支持别名,并且没有技术原因,但接口不支持enable_shared_from_this<A>的配置,以产生可与{共享所有权的shared_ptr<A> shared_ptr<B> {1}}正在管理整个对象。

如果您可以使基础纯虚拟(删除enable_shared_from_thisreturnMe功能),您将拥有更清晰的界面,减少可能起作用的内容和方式。