C++Error2208:…尝试引用已删除的函数

在使用自己编写的类实例化c++stl容器vector时,调用了vector.erase()方法,结果编译器报了以下错误

错误 C2280 “(类名)::operator =(const (类名) &)”: 尝试引用已删除的函数 F:\vs2015\VC\include\xutility 2581

从错误的内容看,似乎是自己的类的赋值构造函数被尝试调用却发现其已被删除。

在翻阅了资料后发现,erase方法会在将对象删除后,将所有该对象之后的对象向前移动。此时会调用该对象的赋值构造函数。

一般而言,对象的赋值构造函数如果开发者没有提供,则编译器会生成默认的赋值构造函数。然而,默认的赋值构造函数在以下几种情况会被删除。

  • 该类含有非静态的const成员变量
  • 该类含有非静态的reference成员变量
  • 该类含有不能被拷贝的成员变量
  • 该类含有不能被拷贝的基类
  • 该类含有用户定义的移动构造函数或者移动赋值函数

自己编写的类中有const成员变量, 将其改成static 或者去掉const 或者添加赋值构造函数,就可以消除这个error.

参考:

stack overflow相关提问
Effect C++ 第二章

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐