我一直在摸索这个问题,在筛选了所有其他帖子之后,我想我已经不知所措了。
我决定要在 C++ 中练习一些模板编码和运算符重载,因此我认为快速而肮脏的 LinkList 实现会走得相当远。我快速破解了一个节点和列表类集,如下:
template <class T>
class Node{
public:
Node* getNext(){ return Next; }
private:
Node* Next;
T data;
};
template <class T>
class List{
public:
List& operator++();
private:
Node<T>* nptr;
};
template <class T>
List<T>& List<T>::operator++(){
if( nptr->getNext() ){
nptr = nptr->getNext();
}
return *this;
}
main call:
int main(){
List<int>* listObj = new listObj<int>();
...push on some nodes with random values...
++listObj;
KABOOM
}
为了便于阅读,我保持代码简短。假设我在创建节点时总是将 Next 初始化为 NULL,有一个 push 函数可以将更多节点添加到末尾,这也将最后一个节点的“Next”变量设置为该新节点,并且 nptr 也开始初始化为 NULL . 我已经测试了所有“假定”功能(构造、初始化、推送节点),我什至可以将 operator++ 函数打包为增量函数......
void Increment(){
if( nptr->getNext() ){
nptr = nptr->getNext();
}
}
call:
listObj->Increment();
...而且效果很好。换句话说:编译器没有将我的 ++foo 版本分配给代码中的任何用途!我什至可以用调试器证明这一点,观察它增加 List 对象的地址,而不是像我想要的那样更新 nptr。
现在,我在这里看到了一个将函数加好友的建议,我尝试了一下:
friend List& operator++(){
if( nptr->getNext() ){
nptr = nptr->getNext();
}
return *this;
}
但是,当我这样做时,会出现编译错误:
List& operator++() must have an argument of class or enumerated type
我是一个头脑冷静的程序员,我认为它希望我确定传入的 RHS,这自然也不起作用。我放弃写出那条断断续续的推理路径,因为我相当有信心这不是正确的方向。
因此,鉴于编译器似乎对我的代码感到满意(或者至少不会因为它实际上没有在任何地方分配它而对它感到不安),为什么它仍然抓住非模板版本的运算符并将其视为 int?我将如何纠正代码以使编译器改为使用提供的函数?
提前致谢!