使用可变参数模板构造存储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,提问作者様 貴方の微笑
相关产品推荐
相关产品推荐

