首页 > 解决方案 > 如何消除关于转换的 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

标签: c++templatesgcceigen

解决方案


推荐阅读