c++ - 在模板类中重载 operator++

标签 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?我将如何着手更正代码以使编译器改为使用提供的函数?

提前致谢!

最佳答案

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

++*listObj;

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

关于c++ - 在模板类中重载 operator++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12454145/

相关文章:

ruby - 在 Ruby 中,我可以覆盖三元运算符 '?'

c++ - 让 QObject 在执行函数之前等待它的监听器

c++ - 从 .txt 文件中读取 UNICODE 字符并将它们输出到控制台

c++ - SDL2 SDL_CreateRenderer 降级OpenGL 上下文,是否可以阻止?

c++ - 是否有泛化 int4、uint4、float4 等的模板化类型?

c++ - CString a = "Hello "+ "World!";是否可以?

c++ - 模板队列得到错误的结果

python - 突出显示主动导航 : django 1. 4.2

c++ - 具有模板类的赋值运算符 - 无可接受的转换,C++

C++ reinterpret_cast - 这总是能正常工作吗?