Я работаю с существующим проектом Visual Studio 2010, и теперь мне нужно добавить новые функции (библиотека Eigen и Point Cloud) в существующий метод (назовем его foo()). Я теперь, когда проект каким-то образом использует C ++ / CLI. Должен признаться, я понятия не имею о C ++ / CLI, просто прочитайте немного об этом. Однако класс, в котором объявлен и определен foo(), кажется обычным классом C ++, без ref или любого другого идентификатора CLI. Но внутри foo() используются ручки (var^). Так что я не совсем уверен, является ли foo() управляемой функцией !? Я могу добавить в эту функцию довольно много обычного кода C ++, но теперь я начал с Eigen и PCL и обнаружил некоторые загадочные ошибки. Например, когда я это объявляю:

 Eigen::Matrix3f m;

Все работает нормально. Но когда я это делаю:

 Eigen::Matrix4f m;

Я получаю следующие ошибки:

error C2711: 'fooclass::foo' : this functon cannot be compiled as managed, consider using #pragma unmanaged 
error C3821: 'void fooclass::foo(void)': managed type or function cannot be used in an unmanaged function

Так что он работает с 3f, но не с 4f! Это так странно, и это всего лишь один пример. Я не могу распознать какой-либо узор. Насколько я понимаю, VS каким-то образом считает, что Matrix4f является управляемой функцией.

Буду признателен за любые чаевые! Я даже не знаю, с чего начать.

0
linsenfips 21 Янв 2014 в 01:02

1 ответ

Лучший ответ

Я ничего не знаю о CLI, но единственное существенное различие между Matrix3f и Matrix4f состоит в том, что второй вектор векторизован и внутренне его данные запрашиваются для согласования с __declspec(align(16)).

1
ggael 21 Янв 2014 в 01:44
1
Хорошо, тогда одно из решений - отключить статическое выравнивание, определив EIGEN_DONT_ALIGN_STATICALLY перед любым заголовком Eigen. Это также отключает векторизацию для Matrix4f и подобных.
 – 
ggael
21 Янв 2014 в 02:08
EIGEN_DONT_ALIGN_STATICALLY делает свое дело! Сейчас он работает. Спасибо.
 – 
linsenfips
21 Янв 2014 в 22:32