Eigen 3.4.0中sqrt无匹配函数编译错误修复咨询
问题
使用Eigen 3.4.0编写计算三角形面积的模板函数时出现编译错误,函数代码如下:
template <typename T, int D> auto TriangleArea(const Eigen::Matrix<T, D, 1>& p0, const Eigen::Matrix<T, D, 1>& p1, const Eigen::Matrix<T, D, 1>& p2) { const auto e01 = p1 - p0; const auto e02 = p2 - p0; return Eigen::sqrt(e01.dot(e01) * e02.dot(e02) - e01.dot(e02) * e01.dot(e02)) / T{2}; }
编译报错信息:
no matching function for call to
‘sqrt(Eigen::ScalarBinaryOpTraits<double, double,
Eigen::internal::scalar_product_op<double, double> >::ReturnType)’
解决方法
原因分析
e01.dot(e01) * e02.dot(e02) - e01.dot(e02) * e01.dot(e02)这个表达式返回的是Eigen内部的延迟计算表达式类型,而非直接的基础标量类型T。Eigen::sqrt主要针对Eigen的矩阵、数组等容器类型设计,无法匹配该内部表达式类型,因此出现编译错误。
方案1:显式转换为基础标量类型T
将表达式结果显式转换为T类型,确保传入sqrt的是基础标量:
template <typename T, int D> auto TriangleArea(const Eigen::Matrix<T, D, 1>& p0, const Eigen::Matrix<T, D, 1>& p1, const Eigen::Matrix<T, D, 1>& p2) { const auto e01 = p1 - p0; const auto e02 = p2 - p0; const T cross_squared = e01.dot(e01) * e02.dot(e02) - e01.dot(e02) * e01.dot(e02); return Eigen::sqrt(cross_squared) / T{2}; }
方案2:使用Eigen的numext::sqrt
Eigen的numext命名空间下的sqrt函数兼容内部表达式类型和基础标量类型,直接替换即可:
template <typename T, int D> auto TriangleArea(const Eigen::Matrix<T, D, 1>& p0, const Eigen::Matrix<T, D, 1>& p1, const Eigen::Matrix<T, D, 1>& p2) { const auto e01 = p1 - p0; const auto e02 = p2 - p0; return Eigen::numext::sqrt(e01.dot(e01) * e02.dot(e02) - e01.dot(e02) * e01.dot(e02)) / T{2}; }
内容的提问来源于stack exchange,提问作者DBS4261
相关产品推荐
相关产品推荐

