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

使用可变参数模板构造存储std::unique_ptr的std::list报错如何解决

问题修复方案

核心错误原因

  • do是C++保留关键字,不能用作自定义函数名,直接使用会触发编译异常
  • 你当前的写法尝试用单个std::unique_ptr<Child>实例初始化std::list,std::list没有对应参数的构造函数,类型不匹配
  • 如果你是要传入多组构造参数、每组对应生成一个Child实例,直接把全部参数一次性传给单个make_unique会导致Child构造函数参数不匹配,就会抛出你遇到的no matching function for call to 'make_unique'错误

对应修复代码

单Child实例场景

如果可变参数仅用来构造1个Child存入list,修改如下:

template<class ...Args>
// 把函数名do换成自定义合法名称,比如create_obj
void create_obj(Args&&... args)
{
    // 用初始化列表构造list,或者直接调用emplace_back插入
    std::list<std::unique_ptr<Base>> obj{
        std::make_unique<Child>(std::forward<Args>(args)...)
    };
}

多Child实例场景

如果需要传入多组参数、每组对应构造一个Child,需要两层参数包展开,C++17及以上版本可以用如下写法:

#include <tuple>
#include <list>
#include <memory>
#include <utility>

// 外层参数包是多个tuple,每个tuple存一组Child的构造参数
template<class ...ArgGroups>
void create_objs(ArgGroups&&... arg_groups)
{
    std::list<std::unique_ptr<Base>> obj;
    // 折叠表达式展开外层参数包
    (
        [&]<class ...InnerArgs>(std::tuple<InnerArgs...>&& group) {
            // std::apply展开内层tuple的参数包,构造Child
            obj.emplace_back(std::apply(
                [](InnerArgs&&... inner_args) {
                    return std::make_unique<Child>(std::forward<InnerArgs>(inner_args)...);
                },
                std::move(group)
            ));
        }(std::forward<ArgGroups>(arg_groups)),
        ...
    );
}

// 调用示例:
// create_objs(std::make_tuple(1, "test1"), std::make_tuple(2, "test2"));
// 上面的调用会生成两个Child实例,分别传入(1,"test1")和(2,"test2")构造

内容的提问来源于stack exchange,提问作者様 貴方の微笑

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:04