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)
你这里有两个问题; 第一个是你意外地重载了乘法运算符而不是解除引用运算符; 第二个是你没有返回引用类型.
第一个问题是由于参数的数量而产生的.类的每个非静态成员函数都有一个额外的"隐藏"参数:this.this当然,是指向调用函数的对象的指针.因此,您实际上已经声明了一个带有两个参数的运算符版本.通过删除第二个迭代器参数并进行操作this,您将重载一元*而不是二元迭代.
第二个问题是返回类型的次要问题; 您将复制到原始对象而不是原始对象本身.声明返回类型T&以返回引用.
| 归档时间: |
|
| 查看次数: |
7627 次 |
| 最近记录: |