2017-02-20 55 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

什麼是散列結構的好方法,以便具有相同數據的實例具有不同的散列值? –

回答