You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:52:21