为什么std :: unordered_set不采用CComBSTR类型作为键?

时间:2019-05-31 16:44:58

标签: c++ visual-studio stl com atl

当我尝试使用std::unordered_set<CComBSTR>(或std::unordered_set<CAdapt<CComBSTR>>)时,出现错误

c:\apps\vs2017pro\vc\tools\msvc\14.16.27023\include\unordered_set(105) : error C2280 : 'std::hash<_Kty>::hash(const std::hash<_Kty> &)' : attempting to reference a deleted function
with
[
    _Kty = ATL::CComBSTR
]

但是std::set<CComBSTR>(或std::set<CAdapt<CComBSTR>>)很好。我正在使用Visual Studio 2017。

我该怎么做才能仍然达到搜索的O(1)时间复杂度?(当然,我们可以使用自定义哈希函数来实现搜索的O(1)时间复杂度。)

可重现的最小示例如下。

#include "atlbase.h" 
#include <unordered_set>
#include <set>

int main()
{
    //std::unordered_set<CComBSTR> s;    // compile error
    //std::unordered_set<CAdapt<CComBSTR>> s;    // compile error

    //std::set<CComBSTR> s;    // ok
    //std::set<CAdapt<CComBSTR>> s;    // ok

    return 0;
}

编辑(06/02/2019):

我了解到CComBSTR没有哈希函数的错误,我们可以创建一个自定义函数。我要问的是std::set具有哈希函数但没有std::unordered_set的设计原因是什么?

1 个答案:

答案 0 :(得分:1)

这里的问题是编译器不知道如何哈希您的密钥。要解决此问题,您需要提供一个自定义哈希函数:

#include "atlbase.h" 
#include <unordered_set>
#include <set>
#include <string>

struct HashBSTR
{
    size_t operator () (const CComBSTR &bstr)
    {
        return std::hash <std::wstring> () (bstr.m_str);
    }
};


int main()
{
    std::unordered_set <CComBSTR, HashBSTR> s;
    return 0;
}