gpt4 book ai didi

c++ - 错误 C2672 : 'std::construct_at' : no matching overloaded function found error

转载 作者:行者123 更新时间:2023-12-05 04:21:55 29 4
gpt4 key购买 nike

struct FrameBufferAttachment
{
std::unique_ptr<Image> AttachmentImage;
//std::unique_ptr<ImageView> AttachmentImageView;
AttachmentType Type = AttachmentType::Color;
};

struct FrameBuffer
{
//std::vector< FrameBufferAttachment> FrameBufferColorAttachments;
FrameBufferAttachment DepthStencilAttachment;

VkFramebuffer framebuffer;
};

std::vector<FrameBuffer> frameBuffers;

我需要这方面的帮助,因为我无法弄清楚问题出在哪里。我收到 error C2672: 'std::construct_at': no matching overloaded function found 但如果我注释掉 FrameBufferAttachment DepthStencilAttachment; 那么错误就会消失。

如果我将唯一指针更改为原始指针,那么错误也会消失。所以我一定是使用了错误的唯一指针。

这是我在代码中使用它的方式

FrameBuffer frameBuffer;
frameBuffers.push_back(frameBuffer);

如果我不推送它就没有错误。

有什么想法吗?

最佳答案

std::unique_ptr是独一无二的,无法复制。

但是我没有复制任何东西,这与错误有什么关系?你可能想知道。

是的,std::vector<>::push_back 的棘手部分来了,它实际上会复制对象而不是在其数组上构造对象,因此对象被构造了两次。如果有的话,那是对时间和资源的不必要浪费。

你可以试试复制FrameBuffer并看到它不会被编译:

FrameBuffer frameBuffer;
FrameBuffer frameBuffer_copy = frameBuffer;

对于大多数情况,更喜欢使用 std::vector<>::emplace_back ,这将在 vector 本身上构造对象,而不是浪费时间制作它的拷贝。参见 this question .

编辑:如@user17732522 所述,这仅适用于 C++17 及更高版本:

FrameBuffer& frameBuffer = frameBuffers.emplace_back();

在 C++17 之前:

frameBuffers.emplace_back();
FrameBuffer& frameBuffer = frameBuffers.back();

关于c++ - 错误 C2672 : 'std::construct_at' : no matching overloaded function found error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74133326/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com