【发布时间】:2014-05-08 18:07:58
【问题描述】:
当我尝试编译我的代码时,我遇到了下一个错误:
./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 类型的对象..
我期待你的反馈,
最好的问候。
【问题讨论】:
-
那条错误信息说明了一切,您遇到了什么问题?您正在尝试返回
Cadena的副本,由于错误消息中解释的原因,这是不可能的。也许您还需要提供一个复制构造函数,或者明确地默认一个? -
实际上,我删除了复制构造函数,我相信移动构造函数与复制具有相同的功能。谢谢!
-
不,复制和移动是两个截然不同的操作,复制时需要复制构造函数。您可以通过将违规行更改为
Cadena direccion() const { return std::move(direccion_); }来修复您的代码,但这可能不是您想要的行为。 -
非常感谢,这就是我想要的
标签: c++ c++11 move-constructor