我对C ++比较陌生,我觉得我在脑海里。我试图创建一个可以使用模板获取任何类型数据的图形结构。这是c_graph.h
#pragma once
#include <vector>
#include <unordered_map>
#include <unordered_set>
template <class T> class c_graph {
private:
std::unordered_map<T,std::unordered_set<T>> adj_matrix;
public:
'' GRAPH OPERATIONS OMITTED ''
};
template <class M> struct node {
public:
M val;
node() {
}
node(M v) {
val = v;
}
};
我想支持直接使用数据(因此图上的模板T),或者将数据包装在底部定义的节点结构中。我对节点结构的原因有时候你希望图中的不同节点具有相同的数据,这些数据不会在没有数据包装器的情况下与邻接矩阵外部的unordered_map一起使用。
但是我遇到了unordered_set类的问题。它没有节点的哈希函数。我在网上看到了这个问题,解决方案似乎就像
namespace std {
template <class M> class hash<node<M>> {
public:
size_t operator()(const node<M> &n) const
{
return reinterpret_cast<size_t>(&n);
}
};
};
我有另一个尝试使用c_graph<node<char>>
然而,对于我的生活,我无法编译我的代码。我已经尝试将哈希片段放在c_graph.h中,在那里我得到了一堆链接器错误
error LNK2019: unresolved external symbol "public: void __thiscall c_graph<struct node<char> >::add_node(struct node<char>)"...
我已经尝试将它放在c_graph.cpp中,我得到了
error C2338: The C++ Standard doesn't provide a hash for this type.
答案 0 :(得分:0)
事实证明,您无法将模板函数声明与模板函数实现分开。 Linker error when using a template class?
将c_graph.cpp的内容移动到c_graph.h中,摆脱了链接器错误