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

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

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

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

Но определение структуры сравнения, которая передается в качестве параметра шаблона в 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;

Node зависит от HeapHandle, а HeapHandle зависит от Node.


person Domderon    schedule 28.11.2012    source источник


Ответы (1)


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

// 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(); 
}
person John Bandela    schedule 28.11.2012
comment
Спасибо, я думаю, я не мог видеть лес для всех (бинарных) деревьев. :) - person Domderon; 29.11.2012