【发布时间】:2014-06-04 22:34:30
【问题描述】:
我有一个类(称为Outer),它有一个私有成员类(Inner)。我想将Outer::Inner 的实例存储在无序的标准容器中,所以我想专门化std::hash<Outer::Inner>。
但是,当写这个时:
namespace std {
template<>
struct hash<Outer::Inner> {
std::size_t operator()(const Outer::Inner &arg) const
{
return std::hash<int>()(arg.someSpecialProperty);
}
};
}
编译器抱怨:
error: 'Inner' is a private member of 'Outer'
std::size_t operator()(const Outer::Inner &p) const
^
我试图通过关注this answer 使std::hash 成为朋友结构,但这也不起作用:Outer::Inner 的前向声明失败:
error: use of undeclared identifier 'Outer'
那么我应该如何进行(如果我打算做的事情是可能的)?
【问题讨论】:
-
通过参考这篇文章:stackoverflow.com/questions/8760181/… 看来你的情况是不可能的,因为你不能在 std::hash 中添加友谊......
-
@AntiClimacus 因为我不是声明原始
std::hash模板的人,对吧? -
这就是原因,是的。
-
@AntiClimacus 哦,谢谢。嗯,这很令人失望。 :-((如果您有这种感觉,请不要犹豫,写一个答案。)
-
你不能在
Outer里面声明friend struct std::hash<Inner>;吗? (可能在声明或定义Inner之后。)然后定义你的专业。
标签: c++ c++11 hash unordered-set stdhash