2017-02-20 11 views
1

私はC++には比較的新しいので、頭の中にいるように感じます。私は、テンプレートを使用して任意の種類のデータを取ることができるグラフ構造を作成しようとしています。ここで私は(グラフ上したがってテンプレートT)データを直接使用して、または下部に定義されたノード構造体でデータをラップサポートしたい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; 
    } 
}; 

あります。ノード構造体の私の理由は、グラフ内の異なるノードにデータラッパーを持たない隣接行列の外側の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ファイルを持っていますコンパイルします。私は、リンカエラー

error LNK2019: unresolved external symbol "public: void __thiscall c_graph<struct node<char> >::add_node(struct node<char>)"... 

の束を得るc_graph.h内部ハッシュスニペットを、置く試みたと私は私が

error C2338: The C++ Standard doesn't provide a hash for this type. 
+0

を処分した、あなたのハッシュ関数は無効である:それは同じであるノードごとに異なる結果を与える可能性があります。 – emlai

+0

Nitpick。 'reinterpret_cast'でハッシュしようとするのは良い考えではありません。 – WhiZTiM

+0

同じデータを持つインスタンスが異なるハッシュ値を持つように構造体をハッシュするにはどうすればよいでしょうか? –

答えて

0

を取得する場所、c_graph.cppの内側にそれを置く試してみました実際にテンプレート関数の宣言をテンプレート関数の実装から分離することはできません。 c_graph.hにc_graph.cppの内容を移動Linker error when using a template class?

がところでリンカエラー

関連する問題