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

标签 c++ templates eigen

我在 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>

这是我使用四元数的代码:

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 被实例化的实例化链的开头。

关于c++ - 无法理解这是循环依赖还是 Clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27094132/

相关文章:

c++ - 是否有一个真正有效的示例显示 x86_64 上 Store-Load 重新排序的副作用?

c++ - 如何在 directshow 中开发视频组合器/生成器过滤器

java - 如何使用 docx4j 删除书签?

c++ - 如何比较两个动态数组并检查哪些元素匹配?

铁路围栏密码的C++程序

C++ lambda 按值语义捕获?

c++ - 将 C++ 模板函数定义存储在 .CPP 文件中

templates - 如何更改 Accounts-UI 模板?

C++ 如何求解非常大的稀疏线性系统

c++ - Eigen C++ 断言失败