shared_ptr隐式强制转换在这里失败,在那里成功

shared_ptr implicit cast failing here and succeeding there?

本文关键字:失败 在这里 在那里 成功 转换 ptr shared      更新时间:2023-10-16

我有一个类MemberBuilder,它为我构建从Member派生的类,其中一个是CommitteeMember。Member是装饰器模式对象链的基类,这些对象是Member派生类的实例。

MemberBuilder包含以下方法为我创建CommitteeMember:

std::shared_ptr<CommitteeMember> MemberBuilder::createCommitteeMember(int memberID, int age, QString& name, QString& surName, Committee* committee)
{
    return std::shared_ptr<CommitteeMember> (new CommitteeMember(memberID,age,name,surName, committee));
}

在同一MemberBuilder中的某些方法中,它包含以下行:

std::shared_ptr<Member> result;
result = createNormalMember(memberID, age, name, surName);

然后再往下走:

std::shared_ptr<Member> newChild = createCommitteeMember(memberID, age, name, surName, commission);
result->addChild(newChild);

这不会产生任何编译器问题。

但是,如果我在某个类中创建一个std::shared_ptr mb,然后执行:

std::shared_ptr<Member> member = getMember(memberID);
std::shared_ptr<Member> newChild = mb->createCommitteeMember(memberID, age, name, surName, commission);
member->addChild(newChild);

getMember具有以下接口:

std::shared_ptr<Member> getMember(int memberID);

我得到

"conversion from std::shared_ptr<CommitteeMember> to non-scalar type std::shared_ptr<Member> requested"

对我来说,我似乎也在做同样的事情,只是我第一次在同一个班里叫它。如果MemberBuilder本身接受了错误,我不明白为什么第二次出现错误。我第二次做错了什么,而第一次没有触发错误?IIRC,如果用原始指针这样做,就不会有问题。

Q: 第二次失败的原因是什么?

正如错误所说,您正在使用不同的指针类型。CCD_ 1与CCD_。很好,你不能进行这种转换,因为引用计数不会被共享,你最终会得到奇怪的对象生存期行为。

为了静态地投射shared_ptr,请查看std::static_pointer_cast<>()