Собственный Vector4d в качестве аргумента функции? - PullRequest
3 голосов
/ 07 февраля 2012

Я пытаюсь передать Eigen :: Vector4d в функцию, подобную этой:

  Matrix3d quat2DCM(Vector4d quat)
  {
    quat = quat;
    return Matrix3d::Identity();
    //nevemind the guts of this function, that'l come after this works
  }

компилятор VC ++ 2005 выдает мне следующую ошибку:

ошибка C2719: 'quat': формальный параметр с __declspec (align ('16 ')) не будет выровнен

Что не происходит для объектов Eigen :: Vector3d в качестве аргументов. Я заметил, что в некоторых онлайн-дискуссиях класс Vector4d особенно требователен к своему выравниванию, больше, чем к другим стандартным определениям типов. При использовании Vector4d в классе я счел необходимым использовать макрос EIGEN_MAKE_ALIGNED_OPERATOR_NEW, который переопределяет new Существует ли аналогичный обходной путь для передачи им аргументов?

1 Ответ

10 голосов
/ 07 февраля 2012

Согласно документации Эйгена, передача собственных объектов фиксированного размера может " быть недопустимой или вызвать сбой вашей программы ". Это связано с тем, что собственные модификаторы выравнивания не соблюдаются, когда объекты передаются по значению. Вы должны изменить свою функцию так, чтобы вместо нее использовалась ссылка const.

Matrix3d quat2DCM(const Vector4d& quat)
{
    ...
}
...