C++链表operator[]重载问题:list[i]调用编译报错
解决L1List operator[]重载的编译错误
看起来你遇到的问题大概率是调用方式不对,结合你提到list->at(i)能正常运行,说明你的list是一个指针类型(比如L1List<int>* list),而不是对象/引用类型!
核心问题:指针的下标 vs 类的operator[]
当你写list[i]时,编译器会把它解析为指针的数组访问——也就是*(list + i),意思是取指针偏移i位置的L1List<int>对象,而不是调用你重载的operator[]。这就导致你试图把一个L1List<int>对象赋值给int变量,自然会报“cannot convert L1List
解决方法很简单:先解引用指针,再调用operator[]:
int a = (*list)[i];
如果你不想用指针,也可以直接把list声明为对象或引用:
L1List<int> list; // 对象 int a = list[i]; // 正常调用operator[]
额外需要修复的代码问题
除了调用方式,你的代码还有两个潜在问题需要修正:
at函数的越界处理
你的at函数在索引i超出链表长度时,没有任何返回值,这属于C++未定义行为,会导致程序崩溃或奇怪的逻辑错误。建议添加越界异常抛出:template <class T> T& L1List<T>::at(int i){ L1Item<T> * pRet = this->_pHead; int idx = 0; while(pRet){ if(i == idx){ return pRet->data; } pRet = pRet->pNext; idx++; } // 索引越界,抛出标准异常 throw std::out_of_range("L1List::at: index out of bounds"); }添加const版本的operator[]和at
如果需要支持const链表对象的访问,你需要实现const版本的成员函数,否则const对象无法调用你的非const版本:// 在L1List类内声明 template <class T> class L1List { // ... 其他成员 public: T& at(int i); const T& at(int i) const; // const版本的at T& operator[](int i); const T& operator[](int i) const; // const版本的operator[] }; // 实现const版本的at template <class T> const T& L1List<T>::at(int i) const { L1Item<T> * pRet = this->_pHead; int idx = 0; while(pRet){ if(i == idx){ return pRet->data; } pRet = pRet->pNext; idx++; } throw std::out_of_range("L1List::at: index out of bounds"); } // 实现const版本的operator[] template <class T> const T& L1List<T>::operator[](int i) const { return at(i); }
内容的提问来源于stack exchange,提问作者Huy Nguy峄卬
相关产品推荐
相关产品推荐

