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

使用std::generate_n生成自定义对象失败,报C2064错误求助

解决std::generate_n调用报错C2064的问题

错误原因

你传给std::generate_n的第三个参数Individual::Spawn(rng)是直接执行Spawn函数的结果——一个std::unique_ptr<Individual>对象,而非可调用的函数对象。但std::generate_n要求第三个参数是无参可调用对象(它会自动调用该对象10次,每次生成一个元素),因此编译器抛出“term does not evaluate to a function taking 0 arguments”错误。

另外还有一个隐藏问题:你直接使用individuals.begin()作为输出迭代器,但此时vector是空的,没有内存空间存放元素,会导致未定义行为,需要用std::back_inserter或者提前分配空间。

修正方案

方案1:使用Lambda表达式(推荐)

通过Lambda捕获随机数生成器rng,在Lambda内部调用Spawn函数,生成符合要求的无参可调用对象:

std::mt19937 rng = std::mt19937(std::random_device{}());

std::vector<std::unique_ptr<Individual>> individuals;
individuals.reserve(10); // 提前预留空间,优化性能
std::generate_n(std::back_inserter(individuals), 10,
    [&rng]() {
        return Individual::Spawn(rng);
    });

方案2:使用std::bind绑定参数

借助std::bind将Spawn函数与rng绑定,生成无参可调用对象(需要包含<functional>头文件):

#include <functional>

std::mt19937 rng = std::mt19937(std::random_device{}());

std::vector<std::unique_ptr<Individual>> individuals;
individuals.reserve(10);
std::generate_n(std::back_inserter(individuals), 10,
    std::bind(&Individual::Spawn, std::ref(rng)));

注意必须用std::ref(rng)传递引用,因为Spawn函数接受的是std::mt19937&类型参数,避免复制随机数生成器导致重复的随机序列。

关键注意点

  • 必须确保vector有足够的存储能力:要么用std::back_inserter自动插入元素,要么提前调用individuals.resize(10)分配空间。
  • 传递随机数生成器时要使用引用,避免复制生成器破坏随机序列的连续性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:45:36