c – 无法理解这是循环依赖还是Clang

我在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的实例化链的开头.

点赞