2016-03-17 5 views
0

Я написал свою собственную функцию сравнения для третьего параметра шаблона std :: unorderd_set. Моя функцияКак использовать unordered_set с функцией сравнения?

static bool HasSamePosition(const Node& a, const Node& b); 

в классе Node. Теперь я пытаюсь использовать эту функцию в своем неупорядоченном наборе,

std::unordered_set<Node, std::hash<Node>, bool(*)(const Node& a, const Node& b)> closedlist(&Node::HasSamePosition); 

но это не работает. Ошибка ist, что ни один экземпляр конструктора не соответствует списку аргументов. Что мне не хватает?

+0

Вы должны заполнить аргументы по умолчанию для конструктора. Или, что еще лучше, завершите вызов функции в конструктивном функциональном объекте по умолчанию и передайте тип этого параметра в качестве параметра шаблона. – milleniumbug

ответ

1

Ну компилятор правильно. Нет конструктора, который позволяет только передать KeyEqual в качестве параметра. Вам нужно использовать другой конструктор (см. here) или изменить тип своей функции.

E.g. Вы можете использовать вспомогательную структуру, которая оборачивается вокруг HasSamePosition вызова и переопределить operator()(const Node& a, const Node& b)

struct Node{ 
    static bool HasSamePosition(const Node& a, const Node& b); 
}; 

struct NodeEqual 
{ 
    bool operator()(const Node& a, const Node& b) { return Node::HasSamePosition(a, b); } 
}; 

int main() 
{ 
    std::unordered_set<Node, std::hash<Node>, NodeEqual> closedlist(); 
} 
+0

См. Мой комментарий к другому ответу. – milleniumbug

+0

@Simon Kraemer, как вы предлагаете выбрать параметр конструктора bucket_count, например. если у меня есть максимум ~ 400 элементов в моем неупорядоченном_set? – user3561614

+1

@ user3561614 Я не могу решить, что у вас будет больше информации. Но так как вам не нужно передавать ничего, кроме вашего типа/экземпляра типа KeyEqual: я бы рекомендовал использовать метод 'operator()()', объявив дополнительную структуру. Либо внутри вашего класса, как в Garf365s, либо в качестве дополнительной структуры, как у меня. –

1

Это проще использовать класс:

class Node 
{ 
    public: 
     class HasSamePosition 
     { 
      bool operator()(const Node& a, const Node& b) 
      { 
       // Put here content of your HasSamePosition function 
      } 
     }; 
    .... 
}; 

std::unordered_set<Node, std::hash<Node>, Node::HasSamePosition> closedlist; 
+0

Удалить парсеры, это объявление функции. – milleniumbug

+0

@milleniumbug Я не понимаю ваш комментарий, вы можете объяснить? – Garf365

+0

'A b();' это объявление функции из-за того, как C++ анализирует его. Чтобы объявить переменную, вам нужно 'A b;' (сравнить 'int main();' to 'int var;') – milleniumbug