从两个 lambda 的函数返回 lambda 时的链接器错误



最近,我一直在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。

谢谢!

声明它"内联"。否则,包含头文件的每个文件都将使用该签名创建一个单独的函数。

链接问题很可能是因为函数定义包含在多个编译单元中的头文件中。 这会导致重复的定义错误。 您需要将声明移动到单个编译中(在头文件中只保留一个声明(,或者使函数staticinline,这允许在不同的编译单元中进行多个定义。

一个更大的问题是,您通过引用函数参数进行绑定,然后返回带有绑定引用的 lambda。 这些引用将在函数返回后变得悬而未决,从而导致在您尝试调用返回的 lambda 时出现未定义的行为。 这是一个特别有害的错误,因为它可能适用于简单的示例和测试程序(内联所有内容(,而对于更复杂的情况则失败。

要解决此问题,您需要按值而不是按引用绑定参数 - 使用[=]而不是[&]

最新更新