我尝试编译代码时遇到下一个错误:
./usuario.h:64:37: error: call to implicitly-deleted copy constructor of 'Cadena' Cadena direccion() const { return direccion_; } ^~~~~~~~~~ ./../P1/Cadena/cadena.h:11:3: note: copy constructor is implicitly deleted because 'Cadena' has a user-declared move constructor Cadena(Cadena&& c);
usuario.cpp:14:3: error: call to implicitly-deleted copy constructor of 'Cadena'
nombre_(nombre), apellidos_(apellidos), direccion_(direccion), password_(password){
^ ~~~~~~
Cadena中的构造函数为:
Cadena(const size_t t=0, const char c=' ');
Cadena(Cadena&& c);
Cadena(const char* c);
和移动构造函数:
Cadena::Cadena(Cadena&& c) : tam_(c.tam_) {
cadena_ = new char[tam_+1];
strcpy(cadena_, c.cadena_);
c.tam_=0;
delete[] c.cadena_;
c.cadena_ = new char[1];
c.cadena_ = "";
}
usuario.h中的声明是:
//........
public:
Cadena id() const { return id_; }
//....
private:
Cadena direccion_;
Cadena类可以完美地工作,但是现在我需要使用它,并且编译器会丢弃这些错误。我认为我没有做任何特别的事情,只返回/分配了Cadena类型的对象。
我期待您的反馈,
最好的祝福。
仅出于完整性考虑,标准要求您的编译器警告行为:
12.8复制和移动类对象[class.copy]
7如果类定义未明确声明一个副本构造函数,则将隐式声明一个副本构造函数。如果类定义声明了move构造函数或move赋值运算符,则隐式声明的副本构造函数将被定义为Delete;否则,将其定义为默认值(8.4)。如果该类具有用户声明的副本分配运算符或用户声明的析构函数,则不建议使用后者。
因此,如果要复制行为,则必须自己提供一个复制构造函数和一个复制赋值运算符。
但是,查看一下您的move构造函数,它似乎没有提供任何移动语义,而是提供了深度复制(提示:做strcopy()
什么?确定不会移动)。因此,我将您当前的move构造函数重命名为copy构造函数,并提供一个实际移动的新move构造函数(即,重新分配char
指针或类中实际数据的句柄)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句