我正在尝试创建一个迭代器类作为列表类的成员类,并尝试重载间接运算符(*)以访问它指向的列表:
template<class T>
T list<T>::iterator::operator*(iterator& iter)
{
return ((iter.lstptr)->current)->data;
}
其中lstptr
是指向列表的指针,current
是指向节点类的指针,节点类包含类型为data
的数据成员T
。
Iterator声明如下:
template<class T>
class list
{
public:
class iterator;
};
template<class T>
class list<T>::iterator
{
//stuff
};
我能够编译重载运算符*的函数定义,但是当我尝试做类似的事情时:
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)
我得到的错误&lt; 1&gt;我正在使用非法间接,并且&lt; 2&gt;它无法从list :: iterator转换为int。这两个错误都发生在第14行。
有人知道我做错了什么以及如何正确地重载间接操作符?
注意:如果你需要查看更多代码,请告诉我哪个部分,因为我不想把整个代码放在这里,因为它有205行,而其中204行没有(我认为)任何错误。
答案 0 :(得分:14)
您重载了乘法运算符。取出参数使其成为间接运算符。
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;
}
答案 1 :(得分:7)
这里有两个问题;第一个是你意外地重载了乘法运算符而不是解除引用运算符;第二个是你没有返回引用类型。
第一个问题是由于参数的数量而产生的。类的每个非静态成员函数都有一个额外的“隐藏”参数:this
。当然,this
是指向调用函数的对象的指针。因此,您实际上已经声明了一个带有两个参数的运算符版本。通过删除第二个迭代器参数并对this
进行操作,您将重载一元*
而不是二进制一个。
第二个问题是返回类型的次要问题;您将复制到原始对象而不是原始对象本身。将返回类型声明为T&
以返回引用。