2012-11-28 107 views
2

我試圖實現一個名爲節點使用Boost的類的指針的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取決於節點。

回答

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

謝謝,我想我不能見木所有(二進制)樹。 :) – Domderon