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

9 c++ operator-overloading indirection

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

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

where lstptr是指向列表current的指针,是指向节点类的指针,节点类包含data类型的数据成员T.

Iterator声明如下:

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

template<class T>
class list<T>::iterator
{
//stuff
};
Run Code Online (Sandbox Code Playgroud)

我能够编译重载运算符*的函数定义,但是当我尝试做类似的事情时:

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)
Run Code Online (Sandbox Code Playgroud)

我得到的错误<1>表示我使用的是非法间接,而<2>表示它无法从list :: iterator转换为int.这两个错误都发生在第14行.

有人知道我做错了什么以及如何正确地重载间接操作符?

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

Dre*_*ann 14

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

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

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

template<class T>
T& list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}
Run Code Online (Sandbox Code Playgroud)

  • 他应该将operator*编写为自由函数,因为它是间接运算符.由OP编写,它是乘法运算符.我实际上也忽略了它,完全忽略了它显然被宣布为成员的事实:) (4认同)

cop*_*pro 7

你这里有两个问题; 第一个是你意外地重载了乘法运算符而不是解除引用运算符; 第二个是你没有返回引用类型.

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

第二个问题是返回类型的次要问题; 您将复制到原始对象而不是原始对象本身.声明返回类型T&以返回引用.