我意识到自己很蠢,所以请放轻松我。是的,这是一项任务,但我想了解我做错了什么,而不仅仅是答案。
我正在尝试在BSTIterator类模板中的二叉搜索树上为迭代器编写operator ==和operator!=函数。
给定(所有在同一个类模板中):
private:
BSTNode<Data>* curr;
...
bool operator==(BSTIterator<Data> const & other) const {
(here's where I do my magic)
}
运营商的相同设置!=。
我写的== ...
return (&curr == other);
我认为我不需要括号,但无论如何......这就是我所拥有的!=
return !(&curr == other);
我的编译器有问题!=但显然不是==。
它吐出了很多狼吞虎咽的东西,但据我所知,相关部分是:
'&amp;('const。中的'operator!='不匹配 BSTIterator *)this) - &gt; BSTIterator :: curr!= other'
它引用了return !(&curr == other);
我认为首先编译器不喜欢我的operator ==函数,但我现在看不到它的引用。除了!
之外,为什么它们会像一个而不是另一个?
如果我需要提供更多信息,请与我们联系。
答案 0 :(得分:4)
据我所知,你的代码curr
表明你的迭代器指向它的位置。
当您将迭代器的实例与另一个实例进行比较时,应该检查它们是否都指向同一位置。我对吗?如果答案是真的,你不应该像这样编码:
bool operator==( BSTIterator<Data> const & other) const {
return this->curr == other.curr;
}
bool operator!=( BSTIterator<Data> const & other) const {
return this->curr != other.curr;
}
关于你的错误:你的编译器说&cur
是一个类型(BSTNode<Data>**
),我不知道如何将它与你的迭代器实例(BSTIterator<Data>
)进行比较这是显而易见的,因为你为你的班级定义了==
和!=
,你从来没有为这样的操作定义和操作,是吗?
答案 1 :(得分:1)
首先要确定操作的语义是什么。对于具有引用语义的类(迭代器表示对容器中元素的引用),相等的通用定义是指的是完全相同的对象。从概念上讲,it1 == it2
iff &*it1 == &*it2
(如果通过operator*
访问的对象的地址相同,则两个迭代器都相同 * )。
之后你只需要进行测试。在您的情况下,如果您有一个指向树中节点的指针,那么如果存储在迭代器中的指针指向同一节点,则两个迭代器是相同的。也就是说,如果存储的指针是相同的。
请注意,在这种情况下,您希望按值比较指针:如果存储在其中的值相同,则两个指针相同,因此您不使用address-of运算符( 1):
return (&curr == other);
^ ^
1 2
另请注意(2)在该行代码中,您将指针curr
与迭代器other
进行比较,这可能没有意义。您想要比较两个存储的指针。