如何创建shared_ptr对象的unordered_set?

时间:2013-06-24 11:51:01

标签: c++ visual-c++ visual-studio-2012 c++11

我正在使用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()));
        }
    };

我通常不愿意责怪编译器,因为这通常是我的错,但这次看起来好像搞砸了......

2 个答案:

答案 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由于某种原因错误地在代码的其他部分出错。我不太了解/足够关心这个问题。现在它似乎工作。谢谢你的帮助。