Khi tôi cố gắng biên dịch như sau (g ++ 4.6.3)Quá tải toán tử C++: không biết chuyển đổi từ đối tượng sang tham chiếu?
class A {};
A& operator*=(A& a, const A& b)
{
return a;
}
A operator*(const A& a, const A& b)
{
return A(a) *= b;
}
int main(int, char*[])
{
A a, b;
a = a*b;
return 0;
}
tôi nhận được lỗi
/tmp/test.cxx: In function ‘A operator*(const A&, const A&)’:
/tmp/test.cxx:14:20: error: no match for ‘operator*=’ in ‘(* & a) *= b’
/tmp/test.cxx:14:20: note: candidate is:
/tmp/test.cxx:6:1: note: A& operator*=(A&, const A&)
/tmp/test.cxx:6:1: note: no known conversion for argument 1 from ‘A’ to ‘A&’
này câu đố tôi - làm thế nào có thể chuyển đổi từ một lớp học để một tham chiếu đến lớp không được biết?
Thay đổi việc kê khai của lớp A như sau không có bất kỳ tác dụng:
class A
{
public:
A() {}
A(const A&) {}
};
Cùng một lỗi.
Tôi sẽ vô cùng biết ơn vì những gợi ý về những gì đang xảy ra ở đây.
Bạn có thể khắc phục vấn đề này bằng cách khai báo toán tử trong phạm vi của lớp. Sau đó, chữ ký phương thức của bạn sẽ giống như sau: 'Toán tử * (const A & rhs) const;' Nếu bạn muốn sử dụng toán tử ghép cho việc thực hiện, bạn có thể viết: 'return * this * = rhs' – Paranaix
@Paranaix: Không, bạn không thể sử dụng 'operator * =' trên '* this' bên trong' const' chức năng thành viên, vì nó sẽ sửa đổi '* this'. –
@BenVoigt: Vâng hoàn toàn đúng của bạn. Tôi muốn viết nó như một lớp lót và vô tình loại bỏ toàn bộ ma thuật. Bí quyết là tạo một bản sao từ 'this'. Ví dụ: 'A ret = * this; ret * = rhs; return ret; ' – Paranaix