C++ 在C+中为迭代器编写运算符==函数+;

C++ 在C+中为迭代器编写运算符==函数+;,c++,debugging,iterator,C++,Debugging,Iterator,我知道我很蠢,所以请对我宽容一点。是的,这是一项作业,但我想了解我做错了什么,而不仅仅是答案 我正在尝试编写一个运算符==和一个运算符!=函数,该函数用于BSTierator类模板中二进制搜索树上的迭代器 给定(全部在同一类模板中): 我想我不需要括号,但无论如何。。。这就是我要的= return !(&curr == other); 我的编译器有问题!=但显然不是 它吐出了很多狼吞虎咽的黏液,但据我所知,相关部分是: “operator!=”不匹配在&(常数 b迭代器*)此)->

我知道我很蠢,所以请对我宽容一点。是的,这是一项作业,但我想了解我做错了什么,而不仅仅是答案

我正在尝试编写一个运算符==和一个运算符!=函数,该函数用于BSTierator类模板中二进制搜索树上的迭代器

给定(全部在同一类模板中):

我想我不需要括号,但无论如何。。。这就是我要的=

  return !(&curr == other);
我的编译器有问题!=但显然不是

它吐出了很多狼吞虎咽的黏液,但据我所知,相关部分是:

“operator!=”不匹配在&(常数 b迭代器*)此)->b迭代器::curr!=其他的

它引用了一行,上面写着
return!(&curr==其他)

我想一开始编译器也不喜欢我的运算符==函数,但现在我看不到对它的引用。除了
之外,它们基本上是一样的,为什么它喜欢其中一个而不是另一个呢


请让我知道,如果我需要包括更多的信息

我从您的代码
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;
}
bool运算符==(b迭代器常量和其他)常量{
返回此->curr==other.curr;
}
接线员=(b迭代器常量和其他)常量{
返回此->curr!=other.curr;
}

关于你的错误:你的编译器说
&cur
是一种类型(
BSTNode**
),我不知道如何将它与迭代器的实例(
bstinerator
)进行比较,这一点很明显,因为你正在定义
=
=首先要确定操作的语义是什么。对于具有引用语义的类(迭代器表示对容器中元素的引用),相等的常见定义是引用完全相同的对象。从概念上讲,
it1==it2
iff
&*it1==&*it2
(如果通过
operator*
访问的对象的地址相同*,则两个迭代器是相同的)

之后,您只需要执行测试。在本例中,如果有一个指向树中节点的指针,那么如果存储在迭代器中的指针指向同一节点,那么这两个迭代器是相同的。也就是说,如果存储的指针相同

请注意,在这种情况下,您希望按值比较指针:如果存储在其中的值相同,则两个指针相同,因此您将而不是使用运算符(1)的地址:


还要注意(2)在那行代码中,您将指针
curr
与迭代器
other
进行比较,这可能没有意义。您想比较两个存储的指针。

啊,谢谢!我被这些东西弄糊涂了。我输入了你写的内容,没有从编译器先生那里得到任何错误。我已经尝试过->、&'s和.'s的每一种变体,但是这一种,哈哈。@punpress你应该努力去理解
->
&
操作符所做的事情,这会让事情更容易理解。记住,想想你正在应用它们的类型,以及它对每种类型的作用;我仍然不明白为什么这个->curr需要一个箭头,而另一个.curr需要一个点。我理解->访问一个成员,但为什么它不也是其他->curr?语言,比如
basic
delphi
,甚至
java
的设计理念是程序员不知道所有事情,所以语言应该抽象出可能的东西,但是C++是由程序员知道每一件事物和语言而设计的,只需提供工具。当你有一个对象
other
时,它的内存被分配(可能在堆栈中),所以你用
访问它不会失败,但是当你用
->
访问指针(
这个
)时,你必须知道你的访问可能会失败,因为指针可能是
空的
或无效的(已经删除),所以原因很明显,
this
other
的类型不相同请注意
this->
在这里不是必需的,您可以说
curr==other.curr
,主要注意的是您必须将
this
curr
与另一个的
curr
进行比较!哦。我很确定我们是在比较地址而不是值。这里是test.cpp文件中的一个位置,它使用==来比较迭代器,一个名为vit initialized at begin(),另一个名为ven at end()
for(;vit!=ven;++vit)
它通过一个int向量并将每个int插入BST。@punstress:指针有一个值,即对象的地址,以及一个存储该值的内存位置
&curr
获取指针的地址,这与指针中存储的值不同(后者是其他对象、节点的地址),巧合的是,有人在我们的类论坛上问到了这一点,回答是“您应该比较当前BST迭代器的curr是否等于”其他。这是检查它们(两种货币)是否相同,而不是其中包含的值。“@punpress:不,你把平等和身份混为一谈。如果存储的指针指向同一内存,则两个不同的指针可以相等<代码>INTA;int*p1=&a,*p2=&1;布尔标识=&p1==&p2;布尔等式=p1==p2。有两个指针,具有不同的地址,尽管它们都指向相同的对象
a
,因此它们是相等的。比较两个对象的地址是一种身份测试,它会告诉您它们是同一个对象,测试值是一种平等性测试,并将
  return !(&curr == other);
bool operator==( BSTIterator<Data> const & other) const {
    return this->curr == other.curr;
}
bool operator!=( BSTIterator<Data> const & other) const {
    return this->curr != other.curr;
}
return (&curr == other);
        ^        ^
        1        2