You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用VBO构造函数出现参数列表不匹配错误的解决方法

问题分析与解决方案

你遇到的错误核心是参数类型不匹配:
VBO的构造函数要求第二个参数是std::vector<std::variant<Vertex, uint32_t>>,但你传入的是std::vector<Vertex>或std::vector<uint32_t>——这两种vector的元素类型完全不同,编译器无法自动将单一类型的vector转换为variant的vector,因此报构造函数不匹配错误。你之前尝试的继承修改、类关系调整都未触及这个核心问题,所以无效。


解决方案

方案1:手动构造符合要求的variant vector

调用VBO时,将传入的vector元素逐个包装成std::variant<Vertex, uint32_t>,再生成新的vector:

VkGraphicsPipeline(VulkanAPI VkApplication, std::vector<Vertex> vertices) : VkGraphicsUnit(VkApplication) {
    std::vector<std::variant<Vertex, uint32_t>> variant_content;
    variant_content.reserve(vertices.size());
    for (const auto& v : vertices) {
        variant_content.emplace_back(v);
    }
    VBO(this, variant_content);
    ...; 
}

如果是uint32_t类型的vector,同理处理:

VkGraphicsPipeline(VkGraphicsUnit* pVkGPU, std::vector<uint32_t> indices) {
    std::vector<std::variant<Vertex, uint32_t>> variant_content;
    variant_content.reserve(indices.size());
    for (const auto& idx : indices) {
        variant_content.emplace_back(idx);
    }
    VBO(pVkGPU, variant_content); 
}

方案2:给VBO添加重载构造函数(更友好)

直接给VBO类添加两个重载构造函数,分别接受std::vector<Vertex>和std::vector<uint32_t>,内部自动转换为variant的vector,调用时无需手动处理:

struct VBO {
    VkBuffer buffer;
    VkDeviceMemory memory;

    // 原构造函数
    VBO(VkGraphicsUnit* pVkGPU, std::vector<std::variant<Vertex, uint32_t>> content) {
        ...; 
    }

    // 重载:处理Vertex类型的vector
    VBO(VkGraphicsUnit* pVkGPU, const std::vector<Vertex>& vertices) 
        : VBO(pVkGPU, convert_to_variant(vertices)) {}

    // 重载:处理uint32_t类型的vector
    VBO(VkGraphicsUnit* pVkGPU, const std::vector<uint32_t>& indices) 
        : VBO(pVkGPU, convert_to_variant(indices)) {}

private:
    // 辅助转换函数
    static std::vector<std::variant<Vertex, uint32_t>> convert_to_variant(const std::vector<Vertex>& vec) {
        std::vector<std::variant<Vertex, uint32_t>> res;
        res.reserve(vec.size());
        for (const auto& v : vec) res.emplace_back(v);
        return res;
    }

    static std::vector<std::variant<Vertex, uint32_t>> convert_to_variant(const std::vector<uint32_t>& vec) {
        std::vector<std::variant<Vertex, uint32_t>> res;
        res.reserve(vec.size());
        for (const auto& idx : vec) res.emplace_back(idx);
        return res;
    }
};

这种方式下你原来的调用代码无需修改,直接传入std::vector<Vertex>或std::vector<uint32_t>即可。

方案3:模板构造函数(更通用)

如果需要支持更多兼容类型,可以将VBO的构造函数改为模板形式:

struct VBO {
    VkBuffer buffer;
    VkDeviceMemory memory;

    // 模板构造函数,限定仅接受Vertex或uint32_t类型的vector
    template<typename T>
    requires (std::is_same_v<T, Vertex> || std::is_same_v<T, uint32_t>)
    VBO(VkGraphicsUnit* pVkGPU, const std::vector<T>& content) {
        std::vector<std::variant<Vertex, uint32_t>> variant_content;
        variant_content.reserve(content.size());
        for (const auto& elem : content) {
            variant_content.emplace_back(elem);
        }
        // 原构造函数的逻辑放在此处,或调用原构造函数
        ...; 
    }

    // 保留原构造函数以兼容旧代码
    VBO(VkGraphicsUnit* pVkGPU, std::vector<std::variant<Vertex, uint32_t>> content) {
        ...; 
    }
};

该方案无需编写多个重载函数,只要是Vertex或uint32_t类型的vector都能直接传入。


内容的提问来源于stack exchange,提问作者ModernEraCaveman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:28