‘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 >’ has no member named ‘serialize’
/usr/include/flann/util/serialization.h:34:14: error: ‘class std::unordered_map >’ has no member named ‘serialize’
原因分析:
FLANN 库的序列化机制尝试调用 std::unordered_map 的 serialize 方法,但 std::unordered_map 本身并没有这个方法。这通常发生在 FLANN 尝试保存或加载其内部数据结构时,特别是与 LSH 索引相关的数据。
解决方案:
此问题通常不是由用户代码直接引起,而是 FLANN 库自身在处理 std::unordered_map 的序列化时存在兼容性问题或缺少特定实现。
* 在你的
catkin 工作空间下,执行 catkin clean -y* 然后重新构建:
catkin build预防措施:
std::unordered_map,最好自己实现一个序列化函数,而不是依赖库的通用模板,除非该库明确支持该容器的序列化。