10

我正在尝试创建一个迭代器类作为列表类的成员类,并尝试重载间接运算符 (*) 以访问它指向的列表:

template<class T>
T list<T>::iterator::operator*(iterator& iter)
{
    return ((iter.lstptr)->current)->data;
}

其中lstptr是指向列表current的指针, 是指向节点类的指针,并且节点类包含datatype的数据成员T

迭代器声明如下:

template<class T>
class list
{
public:
class iterator;
};

template<class T>
class list<T>::iterator
{
//stuff
};

我能够很好地编译重载 operator* 的函数定义,但是当我尝试执行以下操作时:

list<int> lst1;
lst1.add(6);
list<int>::iterator IT;
IT = lst1;
//everything above this point compiles fine
int a = *IT; //error here (line fourteen)

我得到的错误说 <1> 我使用了非法间接,而 <2> 它不能从 list::iterator 转换为 int。两个错误都发生在第十四行。

有谁知道我做错了什么以及如何正确重载间接运算符?

注意:如果您需要查看更多代码,请告诉我哪一部分,因为我不想将整个代码放在这里,因为它大约有 205 行,其中 204 行(我认为)没有任何错误。

4

2 回答 2

15

您重载了乘法运算符。取出参数使其成为间接运算符。

template<class T>
T list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}

如果您想要*IT = 3;编译代码,您还应该让它返回一个引用。

template<class T>
T& list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}
于 2009-05-20T23:19:39.930 回答
7

您在这里有两个问题;首先是您不小心重载了乘法运算符而不是取消引用运算符;第二个是你没有返回引用类型。

第一个问题是由参数数量引起的。类的每个非静态成员函数都有一个额外的“隐藏”参数:this. this当然,是指向正在调用函数的对象的指针。结果,您实际上已经声明了一个带有两个参数的运算符版本。通过删除第二个迭代器参数并对 进行操作this,您将重载一元*而不是二元。

第二个问题是返回类型的次要问题;您将副本返回到原始对象,而不是原始对象本身。将返回类型声明为T&返回引用。

于 2009-05-20T23:48:04.040 回答