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

标签 c++ operator-overloading indirection

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

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

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

迭代器声明如下:

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。这两个错误都发生在第十四行。

有人知道我做错了什么以及如何正确重载间接运算符吗?

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

最佳答案

您重载了乘法运算符。将参数取出来,使其成为间接运算符。

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;
}

关于c++ - 如何重载间接运算符? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/890672/

相关文章:

c++ - D3DX 在错误的坐标中相交光线?

c++ - 重载 < 运算符 C++

c++ - 使用数组的指针间接寻址

char* 与 char(*)[100] 的间接级别不同

c++ - 当我有一个指向对象的指针时,重载的 'dereference' 或 'member of pointer' 运算符不会运行

c# - 好奇的 DllImport 问题,当传递一个 LONG 参数内存损坏时

c++ - 并行多次调用一个函数

python - 如何在C++中展平颜色直方图?

f# - 如何在不破坏对其他类型的支持的情况下正确重载全局 (+) 和 (*)

binding - boost python重载运算符()