复制构造函数在作为参数传递时不起作用shared_ptr

Copy constructor doesn't work when shared_ptr is passed as a parameter

提问人:Coulis 提问时间:12/28/2020 更新时间:12/29/2020 访问量:386

问:

最近,我想在我的代码中从原始指针转向智能指针(请注意,它曾经在原始指针上没有任何问题)。

现在,我的复制构造函数有问题。

假设我想创建一个新的 Frame shared_ptr,如下所示(作为一个对象):f1std::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的工作原理(可能两者兼而有之)。有人可以给我提示一下出了什么问题,我该如何解决这个问题?

干杯!

C++ 引用 shared-ptr 复制构造函数

评论

1赞 NathanOliver 12/29/2020
请使用最小可重复示例或 SSCCE(简短、自包含、正确示例)编辑您的问题
0赞 john 12/29/2020
问题似乎在于如何定义,而不是在你一直在寻找的地方。你能把它添加到你的帖子中吗?duplicateFrame
0赞 Kevin 12/29/2020
也许你只是想要?是否返回共享指针?std::shared_ptr<Frame> global_frame_1 = f1->duplicateFrame();duplicateFrame
0赞 G.M. 12/29/2020
如果已经有一个 copy ctor(并且假设指向一个而不是某个派生类型),为什么不简单地使用 ?Framef1Frameauto global_frame_1 = std::make_shared<Frame>(*f1);
0赞 Coulis 12/29/2020
@Kevin找出解决方案。事实上,我修改了所有函数以返回共享指针,因此无需再次使用 std::make_shared<T>。多谢!

答:

0赞 Yakk - Adam Nevraumont 12/29/2020 #1

因此,您需要找到实际的编译器输出,而不是您显然正在查看的经过清理的列表。

实际编译器输出包括一堆行,其中实例化了带有错误的 tdmplate。这将是代码沙拉。但最终,链将在代码的一行结束。看看它,看看最后的错误。您的代码行导致了最终错误。


因此,make shared 是一个辅助函数,它接受 T 的构造函数参数,并在与引用计数块相邻的内存块中构建一个全新的 T。

如果您真的想要副本,请通过。但是,只有在您想要实际共享所有权时,才应使用共享 ptr。*ptr

切换到唯一 ptr 并使用 make unique 并取消引用指针。

这确实意味着当你有一个非 .owning 引用时,你需要使用一个原始指针。但是,当你没有共享所有权时,使用共享 ptr “因为你不想考虑它”会更糟。

0赞 Coulis 12/29/2020 #2

因此,正如 Kevin 在评论中指出的那样:我不需要做整个事情,因为我修改了方法以返回共享指针。替换它确实成功了。多谢!std::shared_ptr<Frame> global_frame_1 = std::make_shared<Frame>(f1->duplicateFrame())duplicateFrame()std::shared_ptr<Frame> global_frame_1 = f1->duplicateFrame();