我正在尝试使用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。
最佳答案
尝试转发声明节点的声明,然后定义非内联运算符
// 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();
}
关于c++ - 解决模板中的循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13616084/