Tôi đã kiểm tra quá tải nhà điều hành trong C + + và đi qua một cái gì đó tôi đã không mong đợi và có một số nghi ngờ về nó.constructor sao chép rõ ràng biên dịch lỗi
constructor sao chép của tôi là tuyên bố và thực hiện như là
explicit Vector(const Vector& v);
Vector::Vector(const Vector& v) :
_x(v._x), _y(v._y), _z(v._z) {}
sau đó tôi đang quá tải toán tử gán phức hợp
Vector Vector::operator+(const Vector& v) const
{
Vector tmp(*this);
tmp += v;
return tmp;
}
Vector Vector::operator-(const Vector& v) const
{
Vector tmp(*this);
tmp -= v;
return tmp;
}
Tuy nhiên, trong báo cáo return
tôi đã nhận một lỗi nói no matching constructor for initialization of 'Vector'
.
Vì điều duy nhất tôi thêm vào nhà xây dựng của mình là từ khóa explicit
, tôi đã xóa nó và mã biên dịch tốt, tại sao?
Tôi cũng đã kiểm tra công cụ mới từ C++ 11 và xảy ra mà tôi có thể tuyên bố constructor của tôi giống như một chuyển động-constructor
explicit Vector(const Vector&& v);
và mã biên dịch tốt. Nếu tôi làm điều đó, tôi có phải có cả hai bản sao và di chuyển các nhà thầu không?
explicit Vector(const Vector& v);
explicit Vector(const Vector&& v);
hoặc chỉ có trình khởi tạo di chuyển sẽ hoạt động tốt? Nếu tôi muốn gắn bó với C++ 11, phương pháp tiếp cận chính xác là gì?
bản sao có thể có của [Trình tạo bản sao rõ ràng] (http://stackoverflow.com/questions/11480545/explicit-copy-constructor) – Predelnik
Nhiều khả năng '+ =' và '- =' đang tạo bản sao ẩn gây ra lỗi. – NathanOliver
Không phải là câu trả lời mà là nhận xét về mã của bạn. Không có lý do nào để định nghĩa một hàm tạo bản sao như vậy, vì các hàm mặc định sẽ làm chính xác như vậy. Cũng thường có lý do để khai báo một hàm tạo bản sao rõ ràng, vì mục đích của nó là ngăn chặn các chuyển đổi kiểu ngầm định. – MikeMB