2017-01-02 7 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. Я хотел бы, чтобы использовать хэш-функции из базового класса, так что я сделал это:

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

Но она по-прежнему не работает. Если я поместил это перед делением раздела Node, k.hash() не определено (и я не могу переслать declare Node: public bitset <>, так как это невозможно). Если я помещаю это после объявления класса, я получаю ошибку, что для класса Node не существует хеш-функции.

Как я могу решить эту проблему?

+0

Что мешает вам объявить 'хэш {}' 'до того класса Node {}' и 'определяющий size_t хэш :: оператор()' после этого? – Frank

+1

Ни 'Node', ни его базовый класс' std :: bitset', не имеют метода с именем 'hash'. Вы, вероятно, имеете в виду 'return std :: hash >() (k);' –

+0

@IgorTandetnik Я использую визуальную студию 2015, а битсет имеет функцию hash() –

ответ

0

Спасибо, Frank, ваш комментарий на самом деле является решением для меня. Если кому-то нужен код он выглядит следующим образом:

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()' inline, в противном случае вы получите ошибку связывания, как только вы попытаетесь использовать это в двух отдельных единицах перевода. – Frank

+1

Должен быть лучший способ, чем перерезать его в пространство имен 'std'. Это не так. –