如何在调用具有指定确切参数的对象构造函数时修复参数列表错误?

How can I fix an argument list error while calling an objects constructor with the exact arguments specified?

提问人:ModernEraCaveman 提问时间:6/2/2023 最后编辑:273KModernEraCaveman 更新时间:6/2/2023 访问量:69

问:

我正在尝试在对象构造函数中设置一个多类型名方法以从派生类中调用,但我无法弄清楚为什么会出现以下错误:

no instance of constructor "VBO::VBO" matches the argument list
argument types are: 
(VkGraphicsPipeline *, std::vector<Vertex, std::allocator<Vertex>>)

VBO 对象定义如下:

struct VBO {
    VkBuffer buffer;
    VkDeviceMemory memory;
    VBO(VkGraphicsUnit* pVkGPU, std::vector<std::variant<Vertex, uint32_t>> content) {
        ...; }
};

VkGraphicsPipeline 对象定义为 VkGraphicsUnit 对象的子对象:

struct VkGraphicsPipeline : VkGraphicsUnit {   
    VkGraphicsPipeline(VulkanAPI VkApplication, std::vector<Vertex> vertices) : VkGraphicsUnit(VkApplication) {
        VBO(this, vertices);
        ...; }
};

我尝试了以下方法,但都未能修复错误:

在“VkGraphicsUnit”之前添加“public”

struct VkGraphicsPipeline : public VkGraphicsUnit 

将 VBO 添加为 VkGraphicsPipeline 的子类

删除 VkGraphicsUnit 的继承并显式调用它

struct VkGraphicsPipeline {
    VkGraphicsPipeline(VkGraphicsUnit* pVkGPU, std::vector<Vertex> vertices) {
        VBO(pVkGPU, vertices);
        ...; }
};

甚至在 VBO 构造函数中尝试其他可用的变体

VkGraphicsPipeline(VkGraphicsUnit* pVkGPU, std::vector<uint32_t> indices) {
   VBO(pVkGPU, indices); }

在最后两种情况下,我得到的错误是,

no instance of constructor "VBO::VBO" matches the argument list
argument types are:
(VkGraphicsUnit *, std::vector<Vertex, std::allocator<Vertex>>)

no instance of constructor "VBO::VBO" matches the argument list
argument types are:
(VkGraphicsUnit *, std::vector<uint32_t, std::allocator<uint32_t>>)

我完全迷失了解决方案。请帮助我找出我缺少什么,以及如何/是否可以在不使我的代码比现在更复杂的情况下解决此错误。

C++ OOP 继承 构造函数 Vulkan

评论

0赞 ModernEraCaveman 6/2/2023
此外,我尝试将“VBO vbo;”成员添加到 VkGraphicsPipeline 对象,然后从 VkGraphicsPipeline 构造函数中调用“vbo = VBO(pVkGPU, vertices);”,但无济于事。
3赞 vandench 6/2/2023
您将不同类型的向量传递到 VBO。它需要一个变体的向量,而你正在向它传递一个顶点或整数的向量。您也在复制矢量,这不是您当前的问题,但对性能不是很好,尤其是考虑到图形缓冲区可以达到多大。坦率地说,您可能最好只采用原始空指针和数据大小。
0赞 ModernEraCaveman 6/2/2023
@van 啊,好吧,我错误地理解了 std::variant 允许我向函数输入顶点或uint32_t类型,而不是同时输入两者。是否可以概括 std::vector 参数以允许非此即彼?你是否也有一些好的资源来学习如何使用 void 指针作为输入?我完全不熟悉 void 指针以及我在这里如何使用它们。我很欣赏你通俗易懂的解释。
1赞 Jherico 6/2/2023
是的,模板化向量参数。为了上帝的爱,总是通过引用而不是值来传递 STL 容器。
1赞 463035818_is_not_an_ai 6/2/2023
VBO(this, vertices);应该在成员初始值设定项列表中吗?在构造函数的主体中,它没有任何用处

答: 暂无答案