‘class std::unordered_map<unsigned int, std::vector<unsigned int> >’ has no memb...

2025年10月21日 11:33 响应: 18.28秒 状态: success

🚨 错误信息

In file included from /usr/include/flann/util/matrix.h:35, from /usr/include/flann/flann.hpp:41, from /usr/include/pcl-1.10/pcl/kdtree/flann.h:49, from /home/jetson/src/cam_lidar_calibration/src/feature_extractor.cpp:19: /usr/include/flann/util/serialization.h: In instantiation of ‘static void flann::serialization::access::serialize(Archive&, T&) [with Archive = flann::serialization::LoadArchive; T = std::unordered_map<unsigned int, std::vector<unsigned int> >]’: /usr/include/flann/util/serialization.h:42:22: required from ‘void flann::serialization::serialize(Archive&, T&) [with Archive = flann::serialization::LoadArchive; T = std::unordered_map<unsigned int, std::vector<unsigned int> >]’ /usr/include/flann/util/serialization.h:51:33: required from ‘static void flann::serialization::Serializer<T>::load(InputArchive&, T&) [with InputArchive = flann::serialization::LoadArchive; T = std::unordered_map<unsigned int, std::vector<unsigned int> >]’ /usr/include/flann/util/serialization.h:298:28: required from ‘Archive& flann::serialization::InputArchive<Archive>::operator&(T&) [with T = std::unordered_map<unsigned int, std::vector<unsigned int> >; Archive = flann::serialization::LoadArchive]’ /usr/include/flann/util/lsh_table.h:319:10: required from ‘void flann::lsh::LshTable<ElementType>::serialize(Archive&) [with Archive = flann::serialization::LoadArchive; ElementType = float]’ /usr/include/flann/util/serialization.h:34:9: required from ‘static void flann::serialization::access::serialize(Archive&, T&) [with Archive = flann::serialization::LoadArchive; T = flann::lsh::LshTable<float>]’ /usr/include/flann/util/serialization.h:42:22: [ skipping 6 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ] /usr/include/flann/util/serialization.h:34:9: required from ‘static void flann::serialization::access::serialize(Archive&, T&) [with Archive = flann::serialization::LoadArchive; T = flann::LshIndex<flann::L2_Simple<float> >]’ /usr/include/flann/util/serialization.h:42:22: required from ‘void flann::serialization::serialize(Archive&, T&) [with Archive = flann::serialization::LoadArchive; T = flann::LshIndex<flann::L2_Simple<float> >]’ /usr/include/flann/util/serialization.h:51:33: required from ‘static void flann::serialization::Serializer<T>::load(InputArchive&, T&) [with InputArchive = flann::serialization::LoadArchive; T = flann::LshIndex<flann::L2_Simple<float> >]’ /usr/include/flann/util/serialization.h:298:28: required from ‘Archive& flann::serialization::InputArchive<Archive>::operator&(T&) [with T = flann::LshIndex<flann::L2_Simple<float> >; Archive = flann::serialization::LoadArchive]’ /usr/include/flann/algorithms/lsh_index.h:204:9: required from ‘void flann::LshIndex<Distance>::loadIndex(FILE*) [with Distance = flann::L2_Simple<float>; FILE = _IO_FILE]’ /usr/include/flann/algorithms/lsh_index.h:201:10: required from here /usr/include/flann/util/serialization.h:34:14: error: ‘class std::unordered_map<unsigned int, std::vector<unsigned int> >’ has no member named ‘serialize’ 34 | type.serialize(ar); | ~~~~~^~~~~~~~~ /usr/include/flann/util/serialization.h: In instantiation of ‘static void flann::serialization::access::serialize(Archive&, T&) [with Archive = flann::serialization::SaveArchive; T = std::unordered_map<unsigned int, std::vector<unsigned int> >]’: /usr/include/flann/util/serialization.h:42:22: required from ‘void flann::serialization::serialize(Archive&, T&) [with Archive = flann::serialization::SaveArchive; T = std::unordered_map<unsigned int, std::vector<unsigned int> >]’ /usr/include/flann/util/serialization.h:56:33: required from ‘static void flann::serialization::Serializer<T>::save(OutputArchive&, const T&) [with OutputArchive = flann::serialization::SaveArchive; T = std::unordered_map<unsigned int, std::vector<unsigned int> >]’ /usr/include/flann/util/serialization.h:316:28: required from ‘Archive& flann::serialization::OutputArchive<Archive>::operator&(const T&) [with T = std::unordered_map<unsigned int, std::vector<unsigned int> >; Archive = flann::serialization::SaveArchive]’ /usr/include/flann/util/lsh_table.h:319:10: required from ‘void flann::lsh::LshTable<ElementType>::serialize(Archive&) [with Archive = flann::serialization::SaveArchive; ElementType = float]’ /usr/include/flann/util/serialization.h:34:9: required from ‘static void flann::serialization::access::serialize(Archive&, T&) [with Archive = flann::serialization::SaveArchive; T = flann::lsh::LshTable<float>]’ /usr/include/flann/util/serialization.h:42:22: [ skipping 6 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ] /usr/include/flann/util/serialization.h:34:9: required from ‘static void flann::serialization::access::serialize(Archive&, T&) [with Archive = flann::serialization::SaveArchive; T = flann::LshIndex<flann::L2_Simple<float> >]’ /usr/include/flann/util/serialization.h:42:22: required from ‘void flann::serialization::serialize(Archive&, T&) [with Archive = flann::serialization::SaveArchive; T = flann::LshIndex<flann::L2_Simple<float> >]’ /usr/include/flann/util/serialization.h:56:33: required from ‘static void flann::serialization::Serializer<T>::save(OutputArchive&, const T&) [with OutputArchive = flann::serialization::SaveArchive; T = flann::LshIndex<flann::L2_Simple<float> >]’ /usr/include/flann/util/serialization.h:316:28: required from ‘Archive& flann::serialization::OutputArchive<Archive>::operator&(const T&) [with T = flann::LshIndex<flann::L2_Simple<float> >; Archive = flann::serialization::SaveArchive]’ /usr/include/flann/algorithms/lsh_index.h:198:9: required from ‘void flann::LshIndex<Distance>::saveIndex(FILE*) [with Distance = flann::L2_Simple<float>; FILE = _IO_FILE]’ /usr/include/flann/algorithms/lsh_index.h:195:10: required from here /usr/include/flann/util/serialization.h:34:14: error: ‘class std::unordered_map<unsigned int, std::vector<unsigned int> >’ has no member named ‘serialize’ make[2]: *** [CMakeFiles/cam_lidar_calibration.dir/build.make:89:CMakeFiles/cam_lidar_calibration.dir/src/feature_extractor.cpp.o] 错误 1 make[1]: *** [CMakeFiles/Makefile2:3072:CMakeFiles/cam_lidar_calibration.dir/all] 错误 2 make: *** [Makefile:141:all] 错误 2 cd /home/jetson/build/cam_lidar_calibration; catkin build --get-env cam_lidar_calibration | catkin env -si /usr/bin/make --jobserver-auth=3,4; cd - ............................................................................... Failed << cam_lidar_calibration:make [ Exited with code 2 ] Failed <<< cam_lidar_calibration [ 1 minute and 59.6 seconds ] [build] Summary: 0 of 1 packages succeeded. [build] Ignored: None. [build] Warnings: None. [build] Abandoned: None. [build] Failed: 1 packages failed. [build] Runtime: 1 minute and 59.7 seconds total.

🤖 AI解决方案

/usr/include/flann/util/serialization.h:34:14: error: ‘class std::unordered_map<unsigned int, std::vector<unsigned int> >’ has no member named ‘serialize’
/usr/include/flann/util/serialization.h:34:14: error: ‘class std::unordered_map<unsigned int, std::vector<unsigned int> >’ has no member named ‘serialize’

原因分析:
FLANN 库的序列化机制尝试调用 std::unordered_map>serialize 方法,但 std::unordered_map 本身并没有这个方法。这通常发生在 FLANN 尝试保存或加载其内部数据结构时,特别是与 LSH 索引相关的数据。

解决方案:
此问题通常不是由用户代码直接引起,而是 FLANN 库自身在处理 std::unordered_map 的序列化时存在兼容性问题或缺少特定实现。

  • 检查 FLANN 版本: 确认你使用的 FLANN 版本。较旧的版本可能存在此问题。尝试更新 FLANN 到最新稳定版。
  • 检查 PCL 和 FLANN 集成: 如果你是在 PCL (Point Cloud Library) 中使用 FLANN,请确保 PCL 和 FLANN 的版本兼容。有时,PCL 的集成代码可能需要特定的 FLANN 版本或配置。
  • 重新配置/构建: 尝试清除构建目录并重新配置和构建你的项目。有时,构建缓存问题可能导致此现象。
  • * 在你的 catkin 工作空间下,执行 catkin clean -y * 然后重新构建:catkin build

    预防措施:

  • 依赖管理: 在使用第三方库(如 FLANN, PCL)时,务必仔细管理库的版本,并确保它们之间相互兼容。

  • 避免直接序列化STL容器: 如果你需要序列化 std::unordered_map,最好自己实现一个序列化函数,而不是依赖库的通用模板,除非该库明确支持该容器的序列化。