【问题标题】:invalid template compilation无效的模板编译
【发布时间】:2018-10-07 15:14:19
【问题描述】:

我在我的 android 库中包含 CGAL 标头,我收到此错误。我自己没有使用 CGAL::Epick,它是一种在 CGAL 中模板化的类型。这似乎不是 CGAL 特定问题(可能是),但可能是 Android C++ 专家可以帮助我解决的工具链/libc++ 问题。请发表评论。

In file included from /home/ypv/gazebo_dev/240GB/android-ndk-samples/android-dso-server/app/src/main/cpp/dso_server/planning/planning_server/dStar/navGraph.cpp:1:
  In file included from /home/ypv/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/string:470:
  In file included from /home/ypv/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/string_view:169:
  In file included from /home/ypv/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/__string:56:
  In file included from /home/ypv/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/algorithm:643:
  In file included from /home/ypv/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/memory:650:
  In file included from /home/ypv/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/iterator:427:
  /home/ypv/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/__functional_base:60:21: error: invalid operands to binary expression ('const CGAL::Epick' and 'const CGAL::Epick')
          {return __x < __y;}

【问题讨论】:

  • 这里有问题。谁在尝试比较两个内核实例?
  • 你说,CGAL内部没有直接的内核比较?
  • 内核不是你比较的东西。但是根据您提供的信息,我们只能说“有问题”。
  • 一旦包含 CGAL 标头和包含 stl 标头,就会发生此错误,例如矢量或字符串或映射等。我只重新编译了 CGAL 头文件,以消除对 stdc++ 的任何疑问。由于这是一个编译错误,链接到错误的 stl 库似乎不适用。
  • @ypvvpy 你的问题真的很糟糕。你应该给出一些关于你试图编译的代码的上下文。

标签: android cgal toolchain libc++


【解决方案1】:

我找到了问题的解决方案。事实上,编译器正在寻找每个代码库中不存在的 CGAL::Epick 比较运算符,其中 CGAL 内核被隐式添加到 stl 结构中,例如矢量和地图。结构被迭代 C++11 风格,通过不正确的副本而不是引用:

//not
for (auto: vectorOfStructsContainingEpickSets)
//but
for (auto&:vectorOfStructsContainingEpickSets)

因此,这些结构被深度复制,当你对包含 std::set 的结构进行深度复制时,对象本身就是键,不等式运算符被调用,即比较 epick。史诗的不同派生以这种方式存储。

是的,这个问题的最终答案是,CGAL 内核不应该被比较,即使是隐含的。

仍然未知的是为什么 gcc-5 x86_64 linux 编译的代码库没有抱怨在 clang android x86_64 工具链交叉编译中发生了史诗错误的地方。

【讨论】:

  • 此解决方案的范围有限。我仍然需要能够将 CGAL 内核存储在向量和其他容器中。有经验的 CGAL 用户,请帮助理解为什么 CGAL 类型不容易复制到 stl 容器中。
  • 我怀疑 CGAL 类型实际上适用于 STL 容器。我可能正在处理一个修改过的 CGAL 库,并且一些 CGAL 类型已被扩充,即添加了成员​​。
  • 它vectorEpicks真的是一个矢量吗?因为从原始错误的外观来看,它看起来像一个需要比较器的排序容器,就像一个集合。无论如何,为什么需要存储内核实例?同一个内核的两个实例实际上是相同的。
  • 在我的例子中,从epicks派生的结构包含额外的信息,这就是两个epicks之间的区别。为什么将它们存储在一个集合中而没有任何区分的方法,我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多