我在Clang / OS X Yosemite,我的项目使用了Eigen罚款.然后我介绍了一个也使用Eigen的外部库,我现在有了这个编译错误:
/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>
这是我使用Quaternion的代码:
Eigen::Quaternion<double> q, q_wv, q_ic, q_cv;
q_cv = _poseHandler->GetAttitudeMeasurement(); // problem here
首先,由于这包括考虑核心和几何,我不认为这是一个标题丢失.然后我不明白“未定义的模板”错误,因为如果你去研究内部模板在同一个标题中声明.所以我有一个问题:出了什么问题?
更新:
我更改了库中的所有内容以使用import指令而不是include,但它没有解决问题.此外,如果我导入< Eigen / Core>在使用该库的类中,它很好,但是如果我导入< Eigen / Geometry>则不行.
最佳答案 嗯,这并不能完全告诉你什么是错的,但希望能指出你正确的方向.问题是,似乎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来自前向声明,其中给出了默认模板参数.如果您发布完整的错误消息,我们可能能够追踪最终试图导致实例化3X1 quaternionbase_assign_impl的实例化链的开头.