Определите динамическую матрицу с EIGEN

0

У меня проблема с этим кодом, основная идея - создать typedef "Base" с количеством cols, определенных в шаблоне:

// --- Row dynamic matrix
template< class T, int cols >
class RowDynamicMatrixRowMajor : public Eigen::Matrix< T, Eigen::Dynamic, cols,
      Eigen::RowMajor | Eigen::AutoAlign >{
public:
  typedef Eigen::Matrix< T, Eigen::Dynamic, cols, Eigen::RowMajor | Eigen::AutoAlign > Base;

  RowDynamicMatrixRowMajor( void ) : Base()
  {}
  template< typename OtherDerived >
  RowDynamicMatrixRowMajor( const Eigen::MatrixBase< OtherDerived > & other )
      : Base( other )
  {}
  template< typename OtherDerived >
  RowDynamicMatrixRowMajor & operator= ( const Eigen::MatrixBase< OtherDerived > & other )
  {
    this->Base::operator=( other );
    return *this;
  }
};

Но, компилируя код в visual studio 2012, я получаю эту ошибку:

Ошибка 1 ошибка C2975: '_Cols': неверный аргумент шаблона для 'Eigen :: Matrix'; ожидаемое постоянное выражение времени компиляции z:\desktop\photoconsistency-visual-odometry-master\phovo\include\Matrix.h 97 1 ФотоконсистенцияVisualOdometry

Для файла есть 20 подобных ошибок, но я не могу определить ошибку.

  • 1
    Вы не показываете нам истинный источник ошибки. Я не вижу _Cols объявленных где-либо в коде, который вы опубликовали.
  • 0
    Я считаю, что переменная _Cols в ошибке связана с определением Eigen: Matrix: template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>, класс Eigen :: Matrix <_Scalar, _Rows, _Cols , _Options, _MaxRows, _MaxCols> так что в этом случае _Cols - это cols, но я не совсем уверен в этом.
Теги:
eigen
matrix
visual-studio-2012

1 ответ

1

Я могу скомпилировать и запустить это без каких-либо проблем (g++ 4.9), поэтому это не является источником ошибки. Хотя это не ответ, я опубликовал его, так как не могу опубликовать код в комментарии.

template< class T, int cols >
class RowDynamicMatrixRowMajor : public Eigen::Matrix< T, Eigen::Dynamic, cols, 
      Eigen::RowMajor | Eigen::AutoAlign >
{
public:
  typedef Eigen::Matrix< T, Eigen::Dynamic, cols, Eigen::RowMajor | Eigen::AutoAlign > Base;

  RowDynamicMatrixRowMajor( void ) : Base()
  {}
  template< typename OtherDerived >
  RowDynamicMatrixRowMajor( const Eigen::MatrixBase< OtherDerived > & other )
      : Base( other )
  {}
  template< typename OtherDerived >
  RowDynamicMatrixRowMajor & operator= ( const Eigen::MatrixBase< OtherDerived > & other )
  {
    this->Base::operator=( other );
    return *this;
  }
};

int main()
{
    RowDynamicMatrixRowMajor<double, 10> a;     
}

Как побочное замечание, вы уверены, что хотите получить от Эйгена? http://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html

Мне гораздо проще набрать то, что мне нужно (вам нужна поддержка С++ 11 для псевдонимов шаблонов), например, в вашем случае:

template<typename Scalar, int cols> // Eigen::MatrixX<type> (where type = Scalar)
using RowDynamicMatrixRowMajor = 
      Eigen::Matrix<Scalar, Eigen::Dynamic, cols, Eigen::RowMajor | Eigen::AutoAlign>;

затем используйте его, например,

RowDynamicMatrixRowMajor<double, 10> a;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню