2017-01-02 4 views
0

私のコードは以下のようになります。unordered_set <MyClass>へのポインタをmyClassの一部として持つことは可能ですか?

class Node : public bitset<BITS_COUNT> { 
public: 
    Node(string s) : bitset<BITS_COUNT>(s) {} 
    void setGroup(unordered_set<Node>* newSet) { currentGroup = newSet; } 
    unordered_set<Node>* getCurrentSet() { return currentGroup; } 
private: 
    unordered_set<Node>* currentGroup = nullptr; 
}; 

しかし、クラスノードに定義されたハッシュ関数が存在しないため、コンパイラは、私はこれを実行することはできません。基本クラスのハッシュ関数を使用したいので、これを行いました:

しかし、それでも動作しません。 Node delcarationの前にこれを置くと、k.hash()は未定義です(ノード:public bitset <は宣言できません)。これをクラス宣言の後に置くと、クラスNodeのハッシュ関数がないというエラーが発生します。

どうすればこの問題を解決できますか?

+0

'ハッシュ {}'前に 'クラスノードを{}'宣言からあなたを停止し、定義は何 'size_tのハッシュ ::演算子()'その後:誰かが、それはこのようなコードを必要とする場合は? – Frank

+1

'Node'も基本クラス' std :: bitset'も 'hash'という名前のメソッドを持っていません。あなたはおそらく、 'return std :: hash >()(k); –

+0

@IgorTandetnik私はビジュアルスタジオ2015を使用しており、bitsetはhash()という関数を持っています –

答えて

0

おかげさまで、あなたのご意見は実際に私の解決策です。

namespace std 
{ 
    template<> 
    struct hash<Node> 
    { 
     size_t operator()(const Node& k) const; 
    }; 
} 

class Node : public std::bitset<BITS_COUNT> { 
public: 
    Node(std::string s) : bitset<BITS_COUNT>(s) {} 
    void setGroup(std::unordered_set<Node>* newSet) { currentGroup = newSet; } 
    std::unordered_set<Node>* getCurrentSet() { return currentGroup; } 
private: 
    std::unordered_set<Node>* currentGroup = nullptr; 
}; 

namespace std 
{ 
    size_t hash<Node>::operator()(const Node& k) const 
    { 
     return k.hash(); 
    } 
} 
+0

'size_t hash :: operator()'をインラインにしたいと思うでしょう。そうしないと、2つの別々の翻訳単位でこれを使うとすぐにリンクエラーが出ます。 – Frank

+1

これを名前空間 'std'に詰め込むよりも良い方法があります。それは正しいとは思わない。 –

関連する問題