我有以下代码。
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>
是否安全?
答案 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_this
和returnMe
功能),您将拥有更清晰的界面,减少可能起作用的内容和方式。