Разрешить циклическую зависимость в шаблоне

Я пытаюсь реализовать кучу указателей Фибоначчи класса с именем Node, используя Boost.

typedef boost::heap::fibonacci_heap<Node*> FibonacciHeap;
typedef FibonacciHeap::handle_type HeapHandle;

Все идет нормально. Но я также хочу хранить дескрипторы для элементов кучи в классе Node. Boost специально упоминает, что «дескрипторы могут храниться внутри value_type». Увеличение
Однако я не могу определить оператор сравнения внутри класса, потому что куча никогда не использует его и сравнивает только значения указателя.

Но определение структуры сравнения, которая передается как параметр шаблона в fibonacci_heap, вводит циклическую зависимость:

struct CompareNode : public std::binary_function<Node*, Node*, bool>
{
bool operator()(Node* lhs, Node* rhs) const   {
return lhs->getFScore() > rhs->getFScore();
}
};

typedef boost::heap::fibonacci_heap<
Node*,
boost::heap::compare<CompareNode> > FibonacciHeap;

Узел зависит от HeapHandle, а HeapHandle зависит от узла.

2

Решение

Попробуйте переслать объявление Node, а затем определить оператор не в строке

// In Node.h

class Node;
struct CompareNode : public std::binary_function<Node*, Node*, bool>
{
bool operator()(Node* lhs, Node* rhs) const;
};typedef boost::heap::fibonacci_heap<
Node*,
boost::heap::compare<CompareNode> > FibonacciHeap;

typedef FibonacciHeap::handle_type HeapHandle;

class Node{HeapHandle handle_;
int getFScore();
};// In Node.cpp
#include "Node.h"
bool CompareNode::operator()(Node* lhs, Node* rhs) const   {
return lhs->getFScore() > rhs->getFScore();
}
0

Другие решения

Других решений пока нет …