【问题标题】:Is it possible to have pointer to unordered_set<MyClass> as a part of myClass?是否可以将指向 unordered_set<MyClass> 的指针作为 myClass 的一部分?
【发布时间】:2017-01-02 16:09:56
【问题描述】:

我的代码是这样的:

class Node : public bitset<BITS_COUNT> {
public:
    Node(string s) : bitset<BITS_COUNT>(s) {}
    void setGroup(unordered_set<Node>* newSet) { currentGroup = newSet; }
    unordered_set<Node>* getCurrentSet() { return currentGroup; }
private:
    unordered_set<Node>* currentGroup = nullptr;
};

但是编译器不允许我这样做,因为没有为 Node 类定义哈希函数。我希望它使用基类中的哈希函数,所以我这样做了:

namespace std
{
    template<>
    struct hash<Node>
    {
        size_t operator()(const Node& k) const
        {
            return k.hash();
        }
    };
}

但它仍然不起作用。如果我把它放在节点声明之前,k.hash() 是未定义的(我不能转发声明节点:公共位集,因为这是不可能的)。如果我把它放在类声明之后,我会得到错误,即类 Node 没有哈希函数。

我该如何解决这个问题?

【问题讨论】:

  • 是什么阻止您在 class Node {} 之前声明 hash&lt;Node&gt; {} 并在之后定义 size_t hash&lt;Node&gt;::operator()
  • Node 及其基类 std::bitset 都没有名为 hash 的方法。你的意思可能是return std::hash&lt;bitset&lt;BITS_COUNT&gt;&gt;()(k);
  • @IgorTandetnik 我正在使用 Visual Studio 2015 并且 bitset 有一个名为 hash() 的函数
  • 在这种情况下,请注意这个函数是非标准的,甚至不是documented in Microsoft's documentation for bitset。依赖它的持续存在可能是不明智的。

标签: c++ class hash unordered-set


【解决方案1】:

感谢弗兰克,您的评论实际上是我的解决方案。如果有人需要代码,它看起来像这样:

namespace std
{
    template<>
    struct hash<Node>
    {
        size_t operator()(const Node& k) const;
    };
}

class Node : public std::bitset<BITS_COUNT> {
public:
    Node(std::string s) : bitset<BITS_COUNT>(s) {}
    void setGroup(std::unordered_set<Node>* newSet) { currentGroup = newSet; }
    std::unordered_set<Node>* getCurrentSet() { return currentGroup; }
private:
    std::unordered_set<Node>* currentGroup = nullptr;
};

namespace std
{
    size_t hash<Node>::operator()(const Node& k) const
    {
        return k.hash();
    }
}

【讨论】:

  • 您可能希望将size_t hash&lt;Node&gt;::operator() 内联,否则,当您尝试在两个单独的翻译单元中使用它时,您将收到链接错误。
  • 必须有比将其塞入命名空间std 更好的方法。感觉不对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
相关资源
最近更新 更多