C++ 如何从属于同一模板实例的父类调用方法[boost::enable_shared_from_this]

C++ 如何从属于同一模板实例的父类调用方法[boost::enable_shared_from_this],c++,boost,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> {

我有以下代码

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();
    }
};
class A:public boost::从此\u启用\u共享\u{
公众:
虚拟~A(){}
boost::sharedptrreturnme(){
从_this()返回共享的_;
}
};
B类:公共A,公共boost::从\u中启用\u共享\u{
boost::sharedptrreturnme(){
从_this()返回共享的_;
}
};
gcc抱怨来自于此的共享\u不明确。 *在这种情况下,使用
boost::enable_shared_from_this::shared_from_this()
this->boost::从\u this::shared\u from\u this()启用\u shared\u
作为B的回报?
*从中继承的A和B都使用不同的参数从中启用\u共享\u。这似乎正确吗?还是我需要做点别的?

如果B没有继承启用来自\u this的\u共享\u,则在B中使用
shared\u from\u this()
将返回
shared\u ptr
。如果是这样,将
静态\u指针\u转换为
共享\u ptr
是否安全?

您是否尝试更改为
从\u this::从\u this()返回启用\u共享\u之类的内容

有两个基提供了此
的共享,但基的类型不同,因此您可以使用这两个基来消除歧义:

shared_ptr<B> returnMe() {
   return static_cast<boost::enable_shared_from_this<B>*>(this)->shared_from_this();
}
shared\ptr returnMe(){
返回static_cast(this)->shared_from_this();
}
这就是说,设计可能比您想要的要复杂一些,特别是
returnMe
不是一个虚拟函数(也不能是不同的非协变返回类型),这意味着如果您将
B
传递给一个引用或指针指向
a
的函数,并且它们从\u this()调用
shared\u
它将获取错误版本的对象

虽然
shared_ptr
支持别名,并且没有任何技术原因,但接口不支持配置
enable_shared_from_this
以生成
shared_ptr
,该ptr可以与管理整个对象的
shared_ptr
共享所有权


如果您可以使基础纯虚拟(从这个
中删除
enable_shared_和
returnMe
函数),那么您将拥有一个更干净的界面,更少混淆可能的工作方式和方式。

对于您的修复,boost::static_pointer_cast(boost::static_pointer_cast(b)->returnMe())是否等于b->returnMe()?b是b的对象。他们是否真的将共享PTR返回到同一个obj并共享同一个参考计数器?