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()
{}