Почему «const Eigen :: Matrix & lt; & gt; & amp;» и «const Ref & lt; Eigen :: Matrix & lt; & gt; & GT; & Quot; внешне несовместимо?

Вот мой пример кода:

(Обратите внимание на раздел, окруженный #if ENABLE_MY_COMPILE_ERROR)

#include <Eigen/Core>
#include <iostream>

#define ENABLE_MY_COMPILE_ERROR 1

void f1(const Eigen::Ref<Eigen::MatrixXd> a,
const Eigen::Ref<Eigen::MatrixXd> b,
Eigen::Ref<Eigen::MatrixXd> c)
{
c = a * b;
}

int main(int argc, const char *argv[])
{
Eigen::Matrix3d M;
Eigen::Vector3d x;
Eigen::Vector3d y;

M.setRandom();
x.setRandom();

std::cout<<"M = \n"<<M<<std::endl;
std::cout<<"x = \n"<<x<<std::endl;
std::cout<<"M * x = \n"<<M * x<<std::endl;

{
y.setZero();
f1(M,x,y);

std::cout<<"y = \n"<<y<<std::endl;
}

{
Eigen::Matrix3d& MRef = M;

y.setZero();
f1(MRef,x,y);

std::cout<<"y = \n"<<y<<std::endl;
}

#if ENABLE_MY_COMPILE_ERROR
{
const Eigen::Matrix3d& MRef = M;

y.setZero();
f1(MRef,x,y);

std::cout<<"y = \n"<<y<<std::endl;
}
#endif
}

Вот ошибка компиляции, которую я получаю, когда ENABLE_MY_COMPILE_ERROR != 0:

In file included from ../../../../external/src/eigen-current/Eigen/Core:334:0,
from Eigen_Ref.C:1:
../../../../external/src/eigen-current/Eigen/src/Core/PlainObjectBase.h: In constructor ‘Eigen::Ref<PlainObjectType, Options, StrideType>::Ref(const Eigen::DenseBase<OtherDerived>&, typename Eigen::internal::enable_if<(bool)((Eigen::internal::is_lvalue<Derived>::value && (bool)(typename Eigen::internal::traits<Eigen::Ref<_PlainObjectType, _Options, _StrideType> >::match<Derived>::MatchAtCompileTime))), Derived>::type*, int) [with Derived = Eigen::Matrix<double, 3, 3>; PlainObjectType = Eigen::Matrix<double, -1, -1>; int Options = 0; StrideType = Eigen::OuterStride<>; typename Eigen::internal::enable_if<(bool)((Eigen::internal::is_lvalue<Derived>::value && (bool)(typename Eigen::internal::traits<Eigen::Ref<_PlainObjectType, _Options, _StrideType> >::match<Derived>::MatchAtCompileTime))), Derived>::type = Eigen::Matrix<double, 3, 3>]’:
../../../../external/src/eigen-current/Eigen/src/Core/PlainObjectBase.h:726:12: error: ‘Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3> >::<anonymous enum> Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3> >::ThisConstantIsPrivateInPlainObjectBase’ is private
Eigen_Ref.C:47:18: error: within this context

Таким образом, очевидно, что следующие несовместимы:

  • const Eigen::Ref<Eigen::MatrixXd> a

  • const Eigen::Matrix3d& MRef = M

Мои вопросы:

  • Это по замыслу, или это ошибка / недостаток Eigen :: Ref<>?

  • Если по замыслу, то каков хороший способ аккуратно обойти объекты Matrix при сохранении правильности const?

Например, если есть класс с функцией-членом:

const Matrix3d& SomeClass::getTheSuperDuperMatrix() const
{
return this->superDuperMat;
}

и я планирую использовать возвращаемое значение этой функции несколько раз в блоке кода, я хотел бы создать ссылку на него с коротким именем, и я хотел бы, чтобы это была постоянная ссылка.

const Matrix3d& M = someClassInstance.getTheSuperDuperMatrix();

Но тогда я получу вышеуказанную ошибку компиляции, если я передам M в функцию, которая принимает const Ref<Matrix3d> аргумент, такой как:

f1(M,x,y);

К вашему сведению, в настоящее время я использую следующую версию Eigen:

Version: 3.2.91
Revision 5696:af94f93db432

6

Решение

Это потому что const Eigen::Ref<Eigen::MatrixXd> не является постоянной ссылкой. Это должно быть объявлено так:

Eigen::Ref<const Eigen::MatrixXd>
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector