c++ - 如何消除关于转换的 Eigen 编译错误/警告?
问题描述
我在一个具有严格代码样式要求的项目中。并且-Werror=convertion
编译选项是强制性的。
当我使用库 Eigen 时,似乎即使是基本的矩阵乘法也会打破“转换”规则。
那么,消除 Eigen 中的矩阵转换警告/错误的“正确”方法是什么?
我尝试过强制类型转换并且效果很好,但我想知道它是否是一种“优雅”的方式。还有其他解决方案吗?
这个问题可以通过下面的测试代码来说明。
主.cc:
#include <iostream>
#include <Eigen/Core>
int main(int argc, char* argv[]) {
Eigen::Matrix3d m;
m << 1, 1, 1, 2, 2, 2, 3, 3, 3;
Eigen::Vector3d v1(1, 2, 3);
// -Werror=convertion will be triggered: 'Eigen::Type' to 'Eigen::Matrix'
Eigen::Vector3d v2 = m * v1;
// one solution: force type casting, it's OK
// Eigen::Vector3d v2 = (Eigen::Vector3d)(m * v1);
std::cout << v2 << std::endl;
return 0;
}
g++编译命令
g++ main.cc -I../eigen-3.2.10/ -Werror=conversion
编译错误:
In file included from ../eigen-3.2.10/Eigen/Geometry:45:0,
from main.cc:9:
../eigen-3.2.10/Eigen/src/Geometry/Hyperplane.h:48:69: error: conversion to ‘int’ from ‘Eigen::Hyperplane<_Scalar, _AmbientDim, Options>::Index {aka long int}’ may alter its value [-Werror=conversion]
: Index(AmbientDimAtCompileTime)+1,1,Options> Coefficients;
^
main.cc: In function ‘int main(int, char**)’:
main.cc:60:29: error: choosing ‘Eigen::CoeffBasedProduct<Lhs, Rhs, NestingFlags>::operator const PlainObject&() const [with LhsNested = const Eigen::Matrix<double, 3, 3>&; RhsNested = const Eigen::Matrix<double, 3, 1>&; int NestingFlags = 6; Eigen::CoeffBasedProduct<Lhs, Rhs, NestingFlags>::PlainObject = Eigen::Matrix<double, 3, 1>]’ over ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::MatrixBase<OtherDerived>&) [with OtherDerived = Eigen::CoeffBasedProduct<const Eigen::Matrix<double, 3, 3>&, const Eigen::Matrix<double, 3, 1>&, 6>; _Scalar = double; int _Rows = 3; int _Cols = 1; int _Options = 0; int _MaxRows = 3; int _MaxCols = 1]’ [-Werror=conversion]
Eigen::Vector3d v2 = m3 * v1;
^~
main.cc:60:29: error: for conversion from ‘const Type {aka const Eigen::CoeffBasedProduct<const Eigen::Matrix<double, 3, 3>&, const Eigen::Matrix<double, 3, 1>&, 6>}’ to ‘Eigen::Vector3d {aka Eigen::Matrix<double, 3, 1>}’ [-Werror=conversion]
main.cc:60:29: note: because conversion sequence for the argument is better
main.cc:60:29: error: choosing ‘Eigen::CoeffBasedProduct<Lhs, Rhs, NestingFlags>::operator const PlainObject&() const [with LhsNested = const Eigen::Matrix<double, 3, 3>&; RhsNested = const Eigen::Matrix<double, 3, 1>&; int NestingFlags = 6; Eigen::CoeffBasedProduct<Lhs, Rhs, NestingFlags>::PlainObject = Eigen::Matrix<double, 3, 1>]’ over ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::EigenBase<OtherDerived>&) [with OtherDerived = Eigen::CoeffBasedProduct<const Eigen::Matrix<double, 3, 3>&, const Eigen::Matrix<double, 3, 1>&, 6>; _Scalar = double; int _Rows = 3; int _Cols = 1; int _Options = 0; int _MaxRows = 3; int _MaxCols = 1]’ [-Werror=conversion]
main.cc:60:29: error: for conversion from ‘const Type {aka const Eigen::CoeffBasedProduct<const Eigen::Matrix<double, 3, 3>&, const Eigen::Matrix<double, 3, 1>&, 6>}’ to ‘Eigen::Vector3d {aka Eigen::Matrix<double, 3, 1>}’ [-Werror=conversion]
main.cc:60:29: note: because conversion sequence for the argument is better
cc1plus: some warnings being treated as errors
解决方案
推荐阅读
- xml - WPF 如何在带有 XML 元素或属性的文本框上设置正确的数据绑定 (XPath)?
- c# - c# emgu/opencv 使用抛出异常 - 试图读取或写入受保护的内存
- excel - 如何在 Business Objects 中重现等效的 Countif excel 函数?
- flutter - 谷歌地图在颤动中显示空白
- python - ImageMagick 的类型错误
- javascript - js Gamepad API 中的映射错误是否有修复?
- sql - 如何将分钟列添加到日期列sql
- ios - UIGraphicsGetCurrentContext() 获取当前CGContext失败
- vue.js - Vue 范围样式不适用于已添加到插槽中的元素
- node.js - 尝试从单独的页面获取数据时,API 解析而不发送响应