2014-11-23 3 views
4

Я нахожусь на Clang/OS X Yosemite, и мой проект использовал Eigen fine. Затем я ввел внешнюю библиотеку, которая также использует Эйген и теперь у меня есть эта ошибка компиляции:Не могу понять, если это круговая зависимость или Clang

/usr/local/include/Eigen3/Eigen/src/Geometry/Quaternion.h:516:13: Implicit instantiation of undefined template 'Eigen::internal::quaternionbase_assign_impl<Eigen::Matrix<double, 3, 1, 0, 3, 1>, 3, 1>' 

Это, кажется, исходит из декларации в библиотеке:

#include <Eigen/Eigen> 

И это код, в котором Я использую кватернион:

Eigen::Quaternion<double> q, q_wv, q_ic, q_cv; 
q_cv = _poseHandler->GetAttitudeMeasurement(); // problem here 

Прежде всего, так что включать учитывает Ядра и геометрии, я не думаю, что это заголовок отсутствует. Тогда я не понимаю ошибку «неопределенного шаблона», потому что внутренний шаблон объявляется в том же заголовке, если вы заглянете в него. Поэтому у меня остается вопрос: что не так?

UPDATE:

Я изменил все в библиотеке использовать import директиву вместо include, но не решить проблему. Кроме того, если я импортирую <Eigen/Core> в класс, который использует библиотеку, это нормально, но нет, если я импортирую <Eigen/Geometry>.

+1

Эта внешняя библиотека, которая также использует Eigen, включает заголовки Eigen, и может ли она использовать другую версию Eigen? – hvd

+0

Нет, у меня есть источник библиотеки, включенный в мой проект, поэтому с использованием той же версии. – aledalgrande

+0

Хм ... это может быть круговой. Запустите с параметром -E, посмотрите на предварительно обработанный вывод с помощью редактора. – kec

ответ

2

Ну, это не говорит вам, что не так, но, надеюсь, укажет вам в правильном направлении. Проблема в том, что quaternionbase_assign_impl не поддерживает матрицы 3X1, кажется. (Если не существует другой код, который получает в ЕП так или иначе.) Существует прямой декларации о нем:

template<typename Other, 
     int OtherRows=Other::RowsAtCompileTime, 
     int OtherCols=Other::ColsAtCompileTime> 
struct quaternionbase_assign_impl; 

Тогда есть две специализации:

template<typename Other> 
struct quaternionbase_assign_impl<Other,3,3> { ... }; 

и

template<typename Other> 
struct quaternionbase_assign_impl<Other,4,1> { ... }; 

Существует нет «общего» определения шаблона. Таким образом, когда компилятор пытается создать экземпляр

Eigen::internal::quaternionbase_assign_impl<Eigen::Matrix<double, 3, 1, 0, 3, 1>, 3, 1> 

нет совпадения. Обратите внимание, что 3X1 поступает из объявления forward, где указаны аргументы шаблона по умолчанию. Если вы опубликуете полное сообщение об ошибке, мы сможем отслеживать начало последовательности экземпляров, которые в конечном итоге пытаются создать экземпляр 3X1 quaternionbase_assign_impl.

+0

ZOMG Я не могу поверить, что не стал смотреть на фактические параметры шаблона, в конце концов это была действительно глупая ошибка! Фактически эта функция возвращает кватернион, а не матрицу 3x1. Спасибо, вы разблокировали меня, а также заставили меня узнать что-то очень полезное! (ошибка компилятора была немного запутанной) – aledalgrande

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