Собственная матрица фиксированного размера в качестве параметров в функции шаблона

Я пытаюсь написать функцию, которая принимает матрицу фиксированного размера, используя шаблон размера матрицы. Я прочитал http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html, но Я не могу заставить его работать идеально. Я не мог использовать операции блока матрицы фиксированного размера в матрице фиксированного размера внутри моей функции. (TutorialBlockOperations.html">http://eigen.tuxfamily.org/dox/group_TutorialBlockOperations.html)

Я пытался сделать это двумя способами, но оба они не сработали.

Вот определение функции A:

template <int N>
Matrix<double, 3, N> foo(const Matrix<double, 3, N>& v)
{
  Matrix<double, 3, N> ret;

  Vector3d a = v.leftCols<1>();  // error: expected primary-expression before ')' token

  return ret;
}

Вот определение функции B:

template<typename Derived>
Eigen::MatrixBase<Derived> bar(const Eigen::MatrixBase<Derived>& v)
{
  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3,
                  THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);

  Eigen::Matrix<double,
      Derived::RowsAtCompileTime,
      Derived::ColsAtCompileTime> ret;

  Vector3d a = v.leftCols<1>();  // error: expected primary-expression before ')' token

  return ret;
}

Есть идеи?


person Jeongseok Lee    schedule 23.03.2014    source источник


Ответы (1)


Аргумент в версии B правильный, но не тип возвращаемого значения, который должен быть Derived::PlainObject. Вам также потребуется ключевое слово template disambiguate для доступа к члену шаблона в шаблонном коде:

template<typename Derived>
typename Derived::PlainObject bar(const Eigen::MatrixBase<Derived>& v)
{
  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3,
                      THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);

  typename Derived::PlainObject ret;

  Vector3d a = v.template leftCols<1>();

  return ret;
}
person ggael    schedule 24.03.2014
comment
Спасибо, ггал. Но все равно ошибка в Vector3d a = v.leftCols‹1›(); // ошибка: ожидается первичное выражение перед токеном ')'. - person Jeongseok Lee; 25.03.2014
comment
обратите внимание на ключевое слово шаблона. - person ggael; 25.03.2014
comment
Он работает с ключевым словом шаблона. Здорово! Спасибо, это очень помогает. Кстати, я не знаком с этим синтаксисом, добавляющим ключевое слово шаблона в эту позицию. Не могли бы вы дать мне ссылку? - person Jeongseok Lee; 25.03.2014