使用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
相关产品推荐
相关产品推荐

