如何重载间接运算符? (C ++)

时间:2009-05-20 23:01:57

标签: c++ operator-overloading indirection

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

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行没有(我认为)任何错误。

2 个答案:

答案 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&以返回引用。