2017-08-13 55 views
1

最近,我一直在JS画布上做二维和三维分形。现在,我正在通过SDL和Eigen将我的项目移植到C++中。能够编写功能供以后使用非常重要。下面的代码是我在做一个复合函数工厂第一次尝试:从两个lambda函数返回lambda的链接器错误

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。

谢谢!

+3

使函数'inline'?例如。请参阅https://stackoverflow.com/questions/5971736/c-inline-function – stijn

+1

这与lambda无关。 – 2017-08-13 19:08:24

+0

你不应该在头文件中定义函数,这个错误就是为什么。这不是关于“最佳实践”。 – melpomene

回答

0

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

0

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

一个更大的问题是,你通过引用来绑定函数参数,然后返回带有绑定引用的lambda。这些引用将在函数返回后变成悬挂,当您尝试调用返回的lambda时导致未定义的行为。这是一个特别有害的错误,因为它可能适用于简单的示例和测试程序(内置所有内容)并且在更复杂的情况下失败。

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