C++ 非库类型的无序密钥类型需要散列<&燃气轮机;专业化
我正在尝试创建一个std::unordered_映射,其中xercesc::XMLUri作为键类型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!): #包括
#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());
}
};
}