shared_ptr隐式强制转换在这里失败,在那里成功
shared_ptr implicit cast failing here and succeeding there?
我有一个类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<>()
。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么thread_local变量在这里从未初始化?
- 为什么我必须在这里使用dynamic_cast
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 为什么 C++20 中的 [[可能]] 属性在这里引发警告?
- 我在这里正确传递参数了吗?
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 移动语义在这里如何工作?
- 如何在这里循环运行?
- 为什么枚举变量在这里是右值?
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- 试图美化这个Arduino代码[初学者在这里]
- 为什么模板类型推断在这里失败
- 为什么断言在这里失败
- 为什么模板参数演绎/替换在这里失败?
- shared_ptr隐式强制转换在这里失败,在那里成功