我正在使用Visual Studio 2012.当我尝试这个时:
std::unordered_set<std::shared_ptr<A>> myset;
我收到此错误:
错误C2338:C ++标准没有为此类型提供哈希值。
根据标准和此错误报告(https://connect.microsoft.com/VisualStudio/feedback/details/734888#tabs),这应该编译,Microsoft已经在VC ++ 11中实现了支持。那么为什么这不起作用呢?
编辑:我如何使这项工作?我已尝试链接页面上的解决方法,它只是给我一个错误,说已经定义了哈希函数。果然,在VC目录中“memory”文件的第1803行有这样的:
template<class _Ty>
struct hash<shared_ptr<_Ty> >
: public unary_function<shared_ptr<_Ty>, size_t>
{ // hash functor
typedef shared_ptr<_Ty> _Kty;
typedef _Ty *_Ptrtype;
size_t operator()(const _Kty& _Keyval) const
{ // hash _Keyval to size_t value by pseudorandomizing transform
return (hash<_Ptrtype>()(_Keyval.get()));
}
};
我通常不愿意责怪编译器,因为这通常是我的错,但这次看起来好像搞砸了......
答案 0 :(得分:1)
我想您的MSVC版本不支持它,但是有一种解决方法似乎可以在您链接的页面上的“解决方法”选项卡中使用。基本上你只是为这种类型自己实现std::hash
(在这个编译器上)。
答案 1 :(得分:0)
好的,这就是我原来的:
typedef std::shared_ptr<Colony> colony_sptr;
std::unordered_set<colony_sptr> affected_colonies; // ERROR
这就是“修复”它的原因:
std::unordered_set<std::shared_ptr<Colony>> affected_colonies;
编辑:VS重新启动后此错误消失,再次手动定义类型然后切换回typedef时再次出现,之后再次消失。我怀疑这是一个非常奇怪的错误,或者VS由于某种原因错误地在代码的其他部分出错。我不太了解/足够关心这个问题。现在它似乎工作。谢谢你的帮助。