解决模板中的循环依赖关系

时间:2012-11-28 23:11:19

标签: c++ boost dependencies cyclic

我正在尝试使用Boost实现一个名为Node的类的指针Fibonacci堆。

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;

节点依赖于HeapHandle,而HeapHandle依赖于Node。

1 个答案:

答案 0 :(得分:0)

尝试转发声明节点,然后定义不是内联的运算符

// 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(); 
}