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

如何从参数包创建存储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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:20:42