提问人:Coulis 提问时间:12/28/2020 更新时间:12/29/2020 访问量:386
复制构造函数在作为参数传递时不起作用shared_ptr
Copy constructor doesn't work when shared_ptr is passed as a parameter
问:
最近,我想在我的代码中从原始指针转向智能指针(请注意,它曾经在原始指针上没有任何问题)。
现在,我的复制构造函数有问题。
假设我想创建一个新的 Frame shared_ptr,如下所示(作为一个对象):f1
std::shared_ptr<Frame>
std::shared_ptr<Frame> global_frame_1 = std::make_shared<Frame>(f1->duplicateFrame());
对象的复制构造函数定义如下:Frame
Frame::Frame(const Frame& frame) {
m_joints = frame.m_joints;
}
然后,在我提供的第一行代码所在的文件中,它给了我以下错误:
请注意,由于编译器没有将我指向代码中的特定行(而是 xmemory
文件中的一行),因此在查看文件中的指定行后,我只能猜测, 这类任务是我面临的问题。C2664 'Frame::Frame(const Frame &)' : cannot convert parameter 1 from '_Ty' to 'const std::shared_ptr<Frame>'
我首先认为我需要一个需要 的复制构造函数,所以我实现了一个:std::shared_ptr<Frame>
Frame::Frame(const std::shared_ptr<Frame> frame) {
m_joints = frame->m_joints;
}
但是现在它在文件中给了我同样的错误。Frame
似乎我既不完全了解构造函数复制的工作原理,也不完全理解shared_ptr的工作原理(可能两者兼而有之)。有人可以给我提示一下出了什么问题,我该如何解决这个问题?
干杯!
答:
因此,您需要找到实际的编译器输出,而不是您显然正在查看的经过清理的列表。
实际编译器输出包括一堆行,其中实例化了带有错误的 tdmplate。这将是代码沙拉。但最终,链将在代码的一行结束。看看它,看看最后的错误。您的代码行导致了最终错误。
因此,make shared 是一个辅助函数,它接受 T 的构造函数参数,并在与引用计数块相邻的内存块中构建一个全新的 T。
如果您真的想要副本,请通过。但是,只有在您想要实际共享所有权时,才应使用共享 ptr。*ptr
切换到唯一 ptr 并使用 make unique 并取消引用指针。
这确实意味着当你有一个非 .owning 引用时,你需要使用一个原始指针。但是,当你没有共享所有权时,使用共享 ptr “因为你不想考虑它”会更糟。
因此,正如 Kevin 在评论中指出的那样:我不需要做整个事情,因为我修改了方法以返回共享指针。替换它确实成功了。多谢!std::shared_ptr<Frame> global_frame_1 = std::make_shared<Frame>(f1->duplicateFrame())
duplicateFrame()
std::shared_ptr<Frame> global_frame_1 = f1->duplicateFrame();
评论
duplicateFrame
std::shared_ptr<Frame> global_frame_1 = f1->duplicateFrame();
duplicateFrame
Frame
f1
Frame
auto global_frame_1 = std::make_shared<Frame>(*f1);