Неверная компиляция шаблона

Я включаю заголовки CGAL в мою библиотеку Android, и я получаю эту ошибку. Я не использую CGAL::Epick сам, и это тип, который шаблонизируется в CGAL. Это не является специфической проблемой CGAL (это может быть), но может быть проблемой с набором инструментов /libC++, с которой мне могут помочь эксперты по Android C++. Прокомментируйте, пожалуйста.

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;}

1 ответ

Я нашел решение проблемы. Фактически, компилятор искал оператор сравнения CGAL::Epick, которого не было для каждой кодовой базы, где ядра CGAL неявно добавлялись к структурам stl, например, к вектору и карте. Структуры были повторены в стиле C++11, через неправильную копию вместо ссылки:

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

В результате эти структуры были глубоко скопированы, и когда вы глубоко копируете структуру, содержащую std::set, где сам объект является ключом, вызывается оператор неравенства, т.е. сравнивается epick. Различные производные эпопеи хранились таким образом.

Да, ответ на этот вопрос был в конечном счете, ядра CGAL не должны сравниваться, даже неявно.

Что еще неизвестно, так это то, почему gcc-5 x86_64, скомпилированная под Linux, не жаловалась, что произошла ошибка epick в кросс-компиляции clang android x86_64.

Другие вопросы по тегам