Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在实现二叉树的预序迭代器时遇到问题_C++_Templates_Iterator_Iterator Facade - Fatal编程技术网

C++ 在实现二叉树的预序迭代器时遇到问题

C++ 在实现二叉树的预序迭代器时遇到问题,c++,templates,iterator,iterator-facade,C++,Templates,Iterator,Iterator Facade,这是我的main() 谢谢大家的帮助,:)您能告诉我们错误来自哪一行吗?我的灵力告诉我,在某个地方(不是在你发布的代码中),你正在对两个迭代器应用某种二进制运算符,而没有合适的运算符重载。@MikeSeymour我现在已经添加了其余的代码。旧的gcc/boost抱怨使用了抽象的TreeItBase::increment。尝试将其定义为空。还可以尝试直接调用比较运算符,例如boost::operator=(it,tree.PreOrderEnd()。“equal”也不需要是模板方法。@Markus

这是我的
main()


谢谢大家的帮助,:)

您能告诉我们错误来自哪一行吗?我的灵力告诉我,在某个地方(不是在你发布的代码中),你正在对两个迭代器应用某种二进制运算符,而没有合适的运算符重载。@MikeSeymour我现在已经添加了其余的代码。旧的gcc/boost抱怨使用了抽象的TreeItBase::increment。尝试将其定义为空。还可以尝试直接调用比较运算符,例如boost::operator=(it,tree.PreOrderEnd()。“equal”也不需要是模板方法。@MarkusKull顺便说一句,我使用的是
clang++3.1
boost 1.51
。因此,编译器和库都是最新的。但添加一对空的大括号解决了我的问题。
template <class T>
struct BinaryTreeNode
{
    T data_;

    BinaryTreeNode* left_;
    BinaryTreeNode* right_;
};


template <class Node>
class TreeItBase : public boost::iterator_facade<
        TreeItBase<Node>,
        Node,
        boost::forward_traversal_tag
        >
{
public:
    TreeItBase()
        : nodePtr_(0L) {}

    explicit TreeItBase(Node* node)
        : nodePtr_(node) {}

protected:
    friend class boost::iterator_core_access;

    template <class OtherNode>
    bool equal(const TreeItBase<OtherNode>& other) const
    { return nodePtr_ == other.nodePtr_; }

    virtual void increment() = 0;

    Node& dereference() const
    { return *nodePtr_; }

    Node* nodePtr_;
    std::stack<Node*> stack_;
};


template <class Node>
class PreOrderIt : public TreeItBase<Node>
{
private:
    void increment()
    { this->nodePtr_ = this->nodePtr_->right_; } // Ignore the logic error
};
error: invalid operands to binary expression ('BinaryTree<int>::PreIt'
(aka 'PreOrderIt<BinaryTreeNode<int> >') and 'PreIt'
(aka 'PreOrderIt<BinaryTreeNode<int> >'))
template <class T>
class BinaryTree
{
public:
    typedef TreeItBase< BinaryTreeNode<T> > It;
    typedef PreOrderIt< BinaryTreeNode<T> > PreIt;

    void Insert(const T& data);
    void Erase(It& it);

    PreIt PreOrderBegin();
    PreIt PreOrderEnd();
};
int main()
{
    BinaryTree<int> tree;

    for (BinaryTree<int>::PreIt it = tree.PreOrderBegin();
        it != tree.PreOrderEnd(); ++it)
    {
        std::cout << *it << ", ";
    }
    std::cout << "\n";

    return 0;
}
virtual void increment()
{}