【问题标题】:Resolve cyclic dependency in template解决模板中的循环依赖
【发布时间】:2012-11-16 22:53:56
【问题描述】:

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

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。

【问题讨论】:

    标签: c++ boost cyclic-dependency


    【解决方案1】:

    尝试转发声明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(); 
    }
    

    【讨论】:

    • 谢谢,我想我看不到所有(二元)树的木材。 :)
    猜你喜欢
    • 2012-03-09
    • 2018-12-01
    • 1970-01-01
    • 2016-08-27
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多