我正在尝试创建一个迭代器类作为list类的成员类,并尝试重载间接操作符(*)以访问它所指向的列表:
template<class T>
T list<T>::iterator::operator*(iterator& iter)
{
return ((iter.lstptr)->current)->data;
}
其中lstptr
是指向列表的指针,current
是指向节点类的指针,node类包含T
类型的数据成员data
。
迭代器是这样声明的:
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)
我得到的错误是<1>说我使用了非法的间接寻址,<2>说它不能从list::iterator转换成int。这两个错误都发生在第14行。
有人知道我做错了什么吗?知道我如何正确地重载间接操作符吗?
注:如果您需要查看更多代码,请告诉我是哪部分,因为我不想将整个代码放在这里,因为它大约有205行,其中204行(我认为)没有任何错误。
发布于 2009-05-20 15:19:40
您重载了乘法运算符。将参数去掉,使其成为间接运算符。
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-20 15:48:04
这里有两个问题;第一个问题是意外地重载了乘法运算符,而不是取消引用运算符;第二个问题是没有返回引用类型。
第一个问题是由于参数的数量造成的。类的每个非静态成员函数都有一个额外的“隐藏”参数:this
。当然,this
是指向正在调用函数的对象的指针。因此,您实际上声明了一个带有两个参数的运算符版本。通过删除第二个迭代器参数并在this
上操作,您将重载一元*
而不是二进制迭代器。
第二个问题是返回类型的次要问题;您返回的是原始对象的副本,而不是原始对象本身。将返回类型声明为T&
以返回引用。
https://stackoverflow.com/questions/890672
复制相似问题