C++ 非库类型的无序密钥类型需要散列<&燃气轮机;专业化

C++ 非库类型的无序密钥类型需要散列<&燃气轮机;专业化,c++,c++11,unordered-map,xerces-c,C++,C++11,Unordered Map,Xerces C,我正在尝试创建一个std::unordered_映射,其中xercesc::XMLUri作为键类型 #include <unordered_map> #include "xercesc/util/XMLUri.hpp" int main() { std::unordered_map<xercesc::XMLUri,xercesc::XMLUri> uriMap; } 差不多。应该是这样的(感谢@jogojapan指出缺少的typedef!): #包括

我正在尝试创建一个std::unordered_映射,其中xercesc::XMLUri作为键类型

#include <unordered_map>
#include "xercesc/util/XMLUri.hpp"

int main()
{
        std::unordered_map<xercesc::XMLUri,xercesc::XMLUri> uriMap;
}

差不多。应该是这样的(感谢@jogojapan指出缺少的typedef!):

#包括
#包括
名称空间标准
{
模板结构哈希
{
类型定义大小\u t结果\u类型;
typedef xercesc::XMLUri参数_类型;
size_t operator()(xercesc::XMLUri const&uri)const noexcept
{
返回hash()(uri.getUriText());
}
};
}

std::hash
是一个结构,您必须专门化整个结构,而不仅仅是函数,那么您专门化模板的方式也是错误的:

namespace std 
{
    template <>
    struct hash<xercesc::XMLUri>
    {
        size_t operator()(const xercesc::XMLUri& uri) const
        {
            return hash<std::wstring>()(uri.getUriText());
        }
    };
}
名称空间std
{
模板
结构散列
{
size_t运算符()(const xercesc::XMLUri&uri)const
{
返回hash()(uri.getUriText());
}
};
}

这可能是一个不相关的问题,但创建类模板专门化比使用函数模板专门化有什么好处?@user1626720:您别无选择
std::hash
是一个类模板。
std::hash
的完整专门化还应包括
参数类型
结果类型
的定义(§20.8.12/1)。例如,请看我昨天对一个类似问题的回答:@KerrekSB:这有什么区别?可以专门化类模板的成员函数,就好像它是函数模板一样。@ildjarn:interest;说得好!语法仍然与OP不同,即
模板大小\u t hash::operator()(X const&)const noexcept
。但GCC似乎不允许这样做,只接受整个类模板的专门化。大概没有要求以任何特定方式提供
operator()
;i、 它可以是基类成员函数,也可以通过代理对象,等等。
std::hash
是一个模板,而不是“结构”。@KerrekSB,实际上,它是一个结构模板,我想强调的是,它不是一个函数模板。
std::hash
的完整专门化应该包括
参数类型
结果类型
的定义(§20.8.12/1)。例如,请参阅我昨天对一个类似问题的回答:“
std::hash
是一个结构,您必须专门化整个结构,而不仅仅是函数”什么?不,他的语法是错误的,但方法是好的(除了@jogojapan的正确评论)–。
#include "xercesc\util\XMLUri.hpp"
#include <string>

namespace std 
{

    size_t hash<xercesc::XMLUri>::operator()(const xercesc::XMLUri& uri) const
    {
        return hash<std::wstring>()(uri.getUriText());
    }
}
#include <string>
#include <functional>

namespace std
{
    template <> struct hash<xercesc::XMLUri>
    {
        typedef size_t result_type;
        typedef xercesc::XMLUri argument_type;

        size_t operator()(xercesc::XMLUri const & uri) const noexcept
        {
            return hash<wstring>()(uri.getUriText());
        }
    };
}
namespace std 
{
    template <>
    struct hash<xercesc::XMLUri>
    {
        size_t operator()(const xercesc::XMLUri& uri) const
        {
            return hash<std::wstring>()(uri.getUriText());
        }
    };
}