2017-02-20 58 views
1

我相对较新的C + +,我觉得我在我的脑海。我试图创建一个图表结构,可以通过使用模板来获取任何类型的数据。下面是c_graph.hC++无序集设置问题与结构哈希

#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. 
+0

顺便说一句,你的哈希函数是无效的:它可能会给出不同的结果为相等的节点。 – emlai

+0

Nitpick。尝试通过'reinterpret_cast'进行散列并不是一个好主意。 – WhiZTiM

+0

什么是散列结构的好方法,以便具有相同数据的实例具有不同的散列值? –

回答