最近,我一直在JS画布上制作二维和三维分形。现在,我正在努力通过 SDL 和 Eigen 将我的项目移植到C++。能够编写函数以供以后使用非常重要。下面的代码是我第一次尝试制作复合函数工厂:
std::function< Eigen::Vector3f(Eigen::Vector3f) > compose3d(std::function<
Eigen::Vector3f(Eigen::Vector3f) > a, std::function<
Eigen::Vector3f(Eigen::Vector3f) > b){
return [&](Eigen::Vector3f vec)->Eigen::Vector3f{
return b(a(vec));
};
}
目前,这在链接过程中给了我一个重复的符号错误。如果删除此代码,错误将消失。我已经确保这个函数在我的标题的ifndef
部分内。我知道在标题中完全定义函数不是最佳做法,但希望在重构之前让事情正常工作。
总的来说,我只想知道这个问题是否是函数编写中的错误,如果我应该在我的代码中的其他地方查找重复的定义。我知道创建函数指针列表比创建函数列表更好,我将在解决此链接器错误后努力实现它。
对不起,如果这很可怕,我没有写C++很长时间,这是我第一次尝试 lambda。
谢谢!
声明它"内联"。否则,包含头文件的每个文件都将使用该签名创建一个单独的函数。
链接问题很可能是因为函数定义包含在多个编译单元中的头文件中。 这会导致重复的定义错误。 您需要将声明移动到单个编译中(在头文件中只保留一个声明(,或者使函数static
或inline
,这允许在不同的编译单元中进行多个定义。
一个更大的问题是,您通过引用函数参数进行绑定,然后返回带有绑定引用的 lambda。 这些引用将在函数返回后变得悬而未决,从而导致在您尝试调用返回的 lambda 时出现未定义的行为。 这是一个特别有害的错误,因为它可能适用于简单的示例和测试程序(内联所有内容(,而对于更复杂的情况则失败。
要解决此问题,您需要按值而不是按引用绑定参数 - 使用[=]
而不是[&]
。