2

我正在使用 Visual Studio 2012。当我尝试这个时:

std::unordered_set<std::shared_ptr<A>> myset;

我收到此错误:

错误 C2338:C++ 标准不提供此类型的哈希。

根据标准和这个错误报告 ( https://connect.microsoft.com/VisualStudio/feedback/details/734888#tabs ) 这应该可以编译并且微软已经在 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()));
        }
    };

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

4

2 回答 2

1

我猜您的 MSVC 版本不支持它,但是在您链接的页面上的“变通办法”选项卡中似乎有一种变通方法可用。基本上你只是std::hash为这种类型实现自己(在这个编译器上)。

于 2013-06-24T11:58:10.233 回答
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 出于某种原因在我的代码的其他部分误认为错误。我不够了解/不够关心来追踪这一点。现在它似乎工作。谢谢您的帮助。

于 2013-06-24T12:19:37.353 回答