如何从参数包创建存储User对象的std::vector或std::list?
解决
create_user_group模板函数的编译错误 啊,这个问题我之前也踩过坑!你的错误根源在于对模板参数包和std::vector的模板参数匹配理解错了——std::vector的模板定义只需要单个元素类型(比如std::vector<User>),而你直接把参数包Users...传给它,相当于给vector传了4个类型(对应你调用时的4个User实参),这完全不符合vector的模板要求,所以编译器才会报“模板参数数量错误”的提示。
下面给你两种可行的解决方案,按需选择:
方案1:明确指定vector的元素类型为User
如果你的所有输入参数都是User类型(或者可以隐式转换为User),直接把vector的元素类型固定为User即可:
#include <vector> #include <utility> // 用于std::forward实现完美转发 template <typename... Users> auto create_user_group(Users&&... users) { // 明确指定vector的元素类型为User,展开参数包构造容器 return std::vector<User>{std::forward<Users>(users)...}; }
说明:
std::forward<Users>(users)...是完美转发,可以保留每个输入参数的左值/右值属性,让vector的构造更高效(比如直接移动临时User对象,避免拷贝)。- 你的示例调用
auto user_group = create_user_group(User(), User(), User(), User());会正常工作,user_group的类型是std::vector<User>。
方案2:通用版本,自动推导共同元素类型
如果想让函数更灵活,支持传入User的子类(或其他可转换为User的类型),可以用std::common_type_t自动推导所有参数的共同类型:
#include <vector> #include <utility> #include <type_traits> // 用于std::common_type_t template <typename... Users> auto create_user_group(Users&&... users) { // 推导所有参数能转换到的共同类型 using CommonUserType = std::common_type_t<Users...>; return std::vector<CommonUserType>{std::forward<Users>(users)...}; }
说明:
std::common_type_t<Users...>会找出所有Users参数的共同兼容类型,比如你传入User和AdminUser(假设AdminUser是User的子类),这个类型会自动推导为User,同样能正确构造容器。- 这个版本的兼容性更强,同时保留了完美转发的高效性。
再回头看你的错误代码
你原来写的std::vector<Users...>{std::forward<Users>(users)...}相当于试图构造一个std::vector<User, User, User, User>——但std::vector根本不接受多个元素类型参数,它的模板定义是:
template <class T, class Allocator = std::allocator<T>> class vector;
只需要一个元素类型T,这就是编译器报错的核心原因。
内容的提问来源于stack exchange,提问作者mate64
相关产品推荐
相关产品推荐

