shared_ptr隐式转换在这里失败并在那里成功?

时间:2014-04-10 09:55:47

标签: c++ smart-pointers

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

MemberBuilder包含以下方法为我创建委员会成员:

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,如果用原始指针做这个,就不会有问题。

问:第二次失败有什么不同?

1 个答案:

答案 0 :(得分:2)

如错误所示,您正在使用不同的指针类型。 shared_ptr<CommitteeMember>shared_ptr<Member>不同。你不能进行这种转换是件好事,因为引用计数不会被共享,你最终会遇到奇怪的对象生命周期行为。

要静态演员shared_ptr,请查看std::static_pointer_cast<>()