‘class std::unordered_map<unsigned int, std::vector<unsigned int> >’ has no memb...
🚨 错误信息
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 版本或配置。
- 重新配置/构建: 尝试清除构建目录并重新配置和构建你的项目。有时,构建缓存问题可能导致此现象。 * 在你的
- 依赖管理: 在使用第三方库(如 FLANN, PCL)时,务必仔细管理库的版本,并确保它们之间相互兼容。
- 避免直接序列化STL容器: 如果你需要序列化
std::unordered_map,最好自己实现一个序列化函数,而不是依赖库的通用模板,除非该库明确支持该容器的序列化。
catkin 工作空间下,执行 catkin clean -y
* 然后重新构建:catkin build
预防措施: