含std::unordered_set<fs::path>成员的类编译报错,求排查方案
问题解决:std::unordered_setstd::filesystem::path引发“引用已删除函数”错误
问题原因
你遇到的问题是Visual Studio 2019 v142 16.11.3版本的标准库实现缺陷——该版本中std::hash<std::filesystem::path>的特化拷贝构造函数被意外删除,导致std::unordered_set在实例化或拷贝时触发“Attempting to reference a deleted function”错误,即使显式指定该哈希函数也无法解决。
解决方案
方案1:升级Visual Studio版本
将VS2019更新至16.12及以上版本,或直接切换到VS2022,后续版本已修复std::hash<fs::path>的实现问题,无需额外修改代码即可正常使用。
方案2:自定义哈希函数(无法升级时使用)
手动实现一个针对std::filesystem::path的哈希 functor,替代有缺陷的std::hash<fs::path>:
#include <filesystem> #include <unordered_set> #include <string> #include <functional> namespace fs = std::filesystem; struct PathHash { size_t operator()(const fs::path& p) const { // 转换为平台原生字符串后计算哈希 return std::hash<std::string>{}(p.string()); // 若需跨平台一致的哈希值,可改用generic_string() // return std::hash<std::string>{}(p.generic_string()); } }; class A { public: A() = default; A(const A& fc) = default; A& operator=(const A& fc) = default; private: std::unordered_set<fs::path, PathHash> m_files; };
自定义的哈希 functor 不存在拷贝构造问题,可被std::unordered_set正常使用,彻底规避错误。
内容的提问来源于stack exchange,提问作者MorMordoch
相关产品推荐
相关产品推荐

