C ++无序设置问题与struct hash

时间:2017-02-20 00:39:48

标签: c++ c++11 hash c++14

我对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>>

的.cpp文件

然而,对于我的生活,我无法编译我的代码。我已经尝试将哈希片段放在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.

1 个答案:

答案 0 :(得分:0)

事实证明,您无法将模板函数声明与模板函数实现分开。 Linker error when using a template class?

将c_graph.cpp的内容移动到c_graph.h中,摆脱了链接器错误