有谁知道将模板专用化与复合结构中使用的自定义类一起使用的方法?
具体来说,我正在编写一个程序来解析/验证XML文档,其中XML数据存储在自定义复合树结构中,该结构是使用我的class XMLNode
数据结构构造的,如下所示。
每个 XMLNode 对象都在其std::unordered_set<XMLNode> children
成员中存储子节点,我希望使用std::hash
结构的模板专用化,以便可以使用 XMLNode 对象的专用哈希函数插入新节点。这是我到目前为止所拥有的:
#include <string>
#include <unordered_map>
#include <forward_list>
#include <unordered_set>
class XMLNode {
private:
std::string element_name;
std::forward_list<std::string> content;
std::unordered_map<std::string, std::string> attributes;
**std::unordered_set<XMLNode> children;**
public:
// default constructor - sets member variables to empty containers and parent pointer to NULL.
XMLNode() : element_name(), content(), attributes(), children() {};
// copy constructor
XMLNode(const XMLNode & node) : element_name(node.element_name), content(node.content), attributes(node.attributes), children(node.children) {};
// destructor - members of the object are automatically emptied and freed when object passes out of scope.
~XMLNode() {};
// copy assignment operator - deep copy
XMLNode & operator = (const XMLNode & rhs)
{
element_name = rhs.element_name;
content = rhs.content;
attributes = rhs.attributes;
children = rhs.children;
return *this;
};
// compare two nodes are equal (have equal names and attributes)
bool operator ==(const XMLNode & comparison_node) const
{
return (element_name == comparison_node.element_name && attributes == comparison_node.attributes);
};
const std::string & get_name() const
{
return element_name;
};
};
namespace std
{
template<>
**struct hash<XMLNode>**
{
size_t
operator()(const XMLNode & obj) const
{
return hash<string>()(obj.get_name()); // implementation not finalised.
}
};
}
int main()
{
return 0;
}
然而,编译器对此有问题,因为XMLNode
类依赖于std::hash<XMLNode
(因为std::unordered_set<XMLNode> children
),std::hash<XMLNode
需要首先定义class XMLNode
。
具体来说,当使用VS 15.4.4编译时,我收到以下错误:E1449 explicit specialization of class "std::hash<XMLNode>" must precede its first use (at line 575 of "c:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503includetype_traits")
但是,将std::hash<XMLNode>
定义放在XMLNode
定义之前并转发声明XMLNode
类也不会提供解决方案。
有没有人有解决这个问题的设计解决方案?还是这在C++中不可行?谢谢。
只需先声明你的类,再定义。按照这些思路(未测试):
class XMLNode;
namespace std {
template<>
struct hash<XMLNode> {
size_t operator()(const XMLNode & obj) const;
};
}
class XMLNode {
/* actual definition here */
};
size_t std::hash<XMLNode>::operator()(const XMLNode & obj) const {
/* actual definition here */
}