unordered_set of std::filesystem::path 作为数据成员

问题描述 投票:0回答:1

我正在尝试创建一个具有 unordered_set of paths 作为数据成员的类。 起初,我用这个成员声明了一个类并得到错误:

试图引用已删除的函数

在阅读了此处的几篇文章以及阅读 C++17 路径类信息之后,我了解到我缺少指定哈希函数。 所以我试过这个:

class A
{
public:
    A() = default;
    A(const A& fc) = default;
    A& operator=(const A& fc) = default;
private:
    std::unordered_set<fs::path, std::hash<fs::path>> m_files;
};

但尽管指定了内置哈希函数,仍然出现上述错误。 (std::path 也有 operator= 函数)

试图实例化这个类的一个实例,但是得到了描述的错误。 似乎与无序集合哈希函数有关。

Visual Studio 2019 (v142) 16.11.3 C++ 语言标准:ISO C++20 标准 (:/std:c++20) C 语言标准:默认(Legacy MSVC)

我在这里错过了什么?

c++ c++17 unordered-set std-filesystem
1个回答
1
投票
std::unordered_set<fs::path, std::hash<fs::path>>

相当于

std::unordered_set<fs::path>

各方面。说

std::hash<fs::path>
和不说一样

你需要做的是提供一个

std::hash<fs::path>
.

就我个人而言,我不会在这里专攻

std::hash
,因为你不拥有
fs::path
;为了未来的证明,我会写我自己的散列器并将其传递进来。(这里的未来证明是“标准实现了一个,现在我的代码无法编译)。最后我检查了一个措辞糟糕的要求,即你的专业化在
namespace std
中依赖于用户定义的类型(它可能已被固定为更好的措辞),因此定义
std::hash<fs::path>
甚至可能是非法的。我不太在意,因为我认为即使合法也是不好的做法.

struct fs_path_hasher {
  std::size_t operator()(fs::path const& path)const {
    std::hash<fs::path::string_type> hasher;
    return hasher(path.native());
  }
};

现在:

std::unordered_set<fs::path, fs_path_hasher> m_files;

应该编译。

© www.soinside.com 2019 - 2024. All rights reserved.