在模板化类中重载operator ++

时间:2012-09-17 06:32:10

标签: c++ templates operator-overloading

我一直在摸不着这个问题,在筛选完所有其他帖子之后,我觉得我不知所措。

我决定在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。

现在,我看到了一个关于我试用的here函数的建议:

friend List& operator++(){
  if( nptr->getNext() ){
    nptr = nptr->getNext();
  }
  return *this;
}

然而,当我这样做时,我收到编译错误:

List& operator++() must have an argument of class or enumerated type

我是一个头脑冷静的程序员,我想它希望我能够确定即将推出的RHS的范围,这自然也没有用。我正在写出那种破碎的推理路径,因为我相信这不是正确的方向。

所以鉴于编译器似乎对我的代码感到满意(或者至少对它不感到不满,因为它实际上没有在任何地方分配它),为什么它仍然抓住非模板化的版本运算符并将其视为int?我将如何更正代码以使编译器使用提供的函数?

提前致谢!

1 个答案:

答案 0 :(得分:3)

用户定义的运算符从不适用于指针等内置类型。如果有的话,在使用increment运算符之前,需要取消引用指向List的指针:

++*listObj;

如果没有*,则使用内置增量运算符,这显然不是您想要的。我假设你的KABOOM实际上取消了你的指针:你通常想要显示出错的确切代码,你想要更准确地确定实际出错的地方。我还假设你创建的实际编译代码而不是你引用的代码......