инициализация статической собственной матрицы с инициализацией запятой

Я использую библиотеку Eigen здесь: http://eigen.tuxfamily.org/index.php?title=Main_Page

При попытке скомпилировать это возвращает

error: expected constructor, destructor, or type conversion before '.'

жалуюсь на строки, где я добавляю ось x...zaxis в матрицу. возможно ли это потому, что gcc4.3 (который является компилятором, который я использую) не любит этот тип инициализации, потому что точка обычно является вызовом функции (который не будет работать с неинициализированным объектом)?

но мне кажется, что он точно следует примеру учебника здесь: http://eigen.tuxfamily.org/dox/TutorialAdvancedInitialization.html , кроме статики, но без неё ошибка такая же. Я попытался использовать инициализацию через запятую, но снова это то же самое.

// axis system
static Eigen::Matrix<double, 3, 1>    s_xAxis(1.,0.,0.);            //!< global x Axis;
static Eigen::Matrix<double, 3, 1>    s_yAxis(0.,1.,0.);            //!< global y Axis;
static Eigen::Matrix<double, 3, 1>    s_zAxis(0.,0.,1.);            //!< global z Axis;

// origin
static Eigen::Matrix<double, 3, 1>    s_origin(0.,0.,0.);           //!< origin position

static Eigen::Matrix<double, 3,3>     s_idRotationZinverse;
s_idRotationZinverse.col(0) << s_yAxis;
s_idRotationZinverse.col(1) << s_xAxis;
s_idRotationZinverse.col(2) << -s_zAxis;

person the_toast    schedule 23.04.2013    source источник
comment
Может быть, это просто незнакомо, но действительно ли 1. допустим синтаксис (в отличие от 1.0)? Жалоба на компилятор возникает именно там, где вы могли бы, но 0.   -  person Matt Phillips    schedule 23.04.2013
comment
Синтаксис на указанной странице предполагает, что вам нужно: static Eigen::Matrix<double, 3, 1> s_xAxis; s_xAxis << 1., 0., 0.; использовать << для инициализации переменной.   -  person Jonathan Leffler    schedule 23.04.2013
comment
извините, я забыл указать строку. соответствует s_idRotationZinverse.col(0), так что это точка   -  person the_toast    schedule 23.04.2013
comment
Размещенный вами код синтаксически верен и не вызывает проблем в GCC 4.3, пробовал ideone.com/7ITDVK   -  person Kos    schedule 23.04.2013
comment
@Kos Я должен был явно написать, что использую библиотеку Eigen. Спасибо, что попробовали это так, по крайней мере, я знаю, что компилятор должен принимать этот синтаксис.   -  person the_toast    schedule 24.04.2013
comment
Вам нужна вспомогательная функция.   -  person 0x2207    schedule 12.10.2015


Ответы (2)


О, я получил это.

Этот код:

s_idRotationZinverse.col(0) << s_yAxis;

не декларация; это оператор, который должен находиться внутри тела функции.

Вероятно, вы пытаетесь выполнить его вне какой-либо функции, что синтаксически неверно и вызывает упомянутую вами ошибку.

Возможно, вы были обмануты документацией Eigen, которая называет этот синтаксис «инициализацией запятой», где он должен быть «назначением запятой» или около того. Инициализация — это когда вы присваиваете переменной значение при ее определении, а не как отдельный шаг. Инициализация синтаксически является частью объявления, поэтому ее можно выполнять вне тел функций.

Я предлагаю разветвить Eigen для поддержки новой инициализации на основе std::initializer_list (если это не сделано еще) и отправьте запрос на включение.

person Kos    schedule 24.04.2013

Ты пытался:

s_idRotationZinverse.col(0) = s_yAxis;
person Peter R    schedule 23.04.2013
comment
Ошибка компилятора уже перед присваиванием в точке .col(0)... возможно ли это потому, что gcc4.3 (который является компилятором, который я использую) не любит этот тип инициализации? - person the_toast; 23.04.2013