C++ 内部哈希类声明失败

C++ 内部哈希类声明失败,c++,C++,我希望在外部类的内部有一个内部类,并让外部类将该内部类放入哈希表中。实现这一目标的明智方法是什么? 我的尝试: #include <unordered_set> class Outer { public: struct Inner { int x; }; std::unordered_set<Outer::Inner> inners; }; namespace std { template<> struct hash<Out

我希望在外部类的内部有一个内部类,并让外部类将该内部类放入哈希表中。实现这一目标的明智方法是什么? 我的尝试:

#include <unordered_set>

class Outer {
public:
  struct Inner {
    int x;
  };

  std::unordered_set<Outer::Inner> inners;
};

namespace std {
  template<> struct hash<Outer::Inner> {
    size_t operator()(const Outer::Inner& o) {
      return 42;
    }
  };
}

int main() {
  Outer outer;
  std::unordered_set<Outer::Inner> inners;
  return 0;
}
#包括
类外部{
公众:
结构内部{
int x;
};
std::无序的集合内部;
};
名称空间标准{
模板结构哈希{
size\u t运算符()(常量外部::内部(&o){
返回42;
}
};
}
int main(){
外部的;
std::无序的集合内部;
返回0;
}

不起作用,因为std::hash专门化不是由tie定义的。我试图声明类Outer的无序集字段。

不确定这是否算作“正常”,但这是我想到的第一个想法

您可以创建一个自定义哈希类,该类将
operator()
调用转发到目标对象的成员函数(
.hash()
,在下面的实现中)

#包括
#包括
结构成员散列{
模板std::size\u t运算符()(常量t&o)常量{
返回o.hash();
}
};
类外部{
公众:
结构内部{
int x;
std::size\u t hash()常量{
返回42;
}
};
std::无序的集合内部;
};
int main(){
外部的;
std::无序的集合内部;
返回0;
}

还要注意的是,哈希类的
operator()
应该是
const
,至少在我的GCC上,它拒绝以其他方式工作。

我主要认为这种方法不合理,因为集合的声明变得非常糟糕,但后来我意识到我可以定义它并放弃了。
#include <cstddef>
#include <unordered_set>

struct member_hash {
  template <typename T> std::size_t operator()(const T &o) const {
    return o.hash();
  }
};

class Outer {
public:
  struct Inner {
    int x;
    std::size_t hash() const {
      return 42;
    }
  };

  std::unordered_set<Outer::Inner, member_hash> inners;
};

int main() {
  Outer outer;
  std::unordered_set<Outer::Inner, member_hash> inners;
  return 0;
}