2013-11-15 5 views
1

II хотел бы использовать Eigen для линейной алгебры в проекте геометрии, над которым я сейчас работаю. Это отличная библиотека, относительно небольшая и простая в использовании и достаточно популярная.Использование Eigen :: Модуль геометрии с пользовательским скалярным типом

Тем не менее, я также хотел бы использовать пользовательский определенный класс «Двойной», чтобы иметь возможность сравнивать два значения с плавающей запятой в компьютерной точности (что-то вроде разницы между ними должно быть меньше заданной точности). Для моего настраиваемого типа я реализовал большинство функций std :: math C++ 11 и всех операторов (включая унарные, конью, imag, abs2 ...). Я сделал все, перечисленное в этих ссылках:

http://eigen.tuxfamily.org/dox-devel/TopicCustomizingEigen.html

https://forum.kde.org/viewtopic.php?f=74&t=26631

Однако, я все еще получаю ошибку компиляции в Эйгене Jacobi.h файл, а точнее на линии 340,341, которые являются:

x[i] = c * xi + numext::conj(s) * yi; 
y[i] = -s * xi + numext::conj(c) * yi; 

Я получаю следующую ошибку от компилятора (Vs 2012, Win32, Release и Debug Configuration)

eigen\src/Jacobi/Jacobi.h(341): error C3767: '*': candidate function(s) not accessible 

оператор *, это определить в моем пользовательском типе для следующих случаев:

CustomType operator*(CustomType const &_other); 
CustomType operator*(double const &_other); 
double operator*(CustomType const &_other); 

Я попытался определить CONJ следующих способов:

CustomType conj(CustomType const &_type){return _type;} 
double conj(customType const &_type){return _type.get();} 

Я попытался определением CONJ в Эйгене :: numext пространство имен а также в моем пространстве имен CustomType без успеха. У кого-нибудь есть подсказка, ссылка, предложение или знать что-то. Собственные потребности, которые я, возможно, забыл?

ответ

1

Скорее всего, ваш код не const correct.

Ваш оператор перегрузки должен быть:

CustomType operator*(CustomType const &_other) **const**; 
CustomType operator*(double const &_other) **const**; 
double operator*(CustomType const &_other) **const**; 

Если собственное имеет константную ссылку на объект типа CustomType он не может назвать свои операторы, потому что они не Const объявлены.

I.e.

void foo(const CustomType& x, const CustomType& y){ 
    x * y; // Compile error, cannot call non-const operator * on const object. 
} 
+0

Впечатляет, я полностью пропустил это. Ну, это немного «поздно», но это хороший ответ. – ahesa

0

Не уверен, что это проблема здесь, но вы должны специализироваться на Eigen::NumTraits<T>. См. Это manpage.

Также я не понимаю, как вы можете использовать две функции conj с теми же аргументами, которые возвращают разные типы.

+0

Я имел в виду, я попробовал две версии функции conj. На всякий случай. Я специализировал Eigen :: NumTraits в отдельном файле заголовка в пространстве имен Eigen. Я скопировал пример в первой ссылке. Может быть, ему нужно больше? – ahesa

Смежные вопросы