Tôi muốn biết tại sao chuyển đổi loại ngầm định không hoạt động với quá tải toán tử bên ngoài trên các mẫu lớp. Dưới đây là làm việc, không templated phiên bản:Chuyển đổi ngầm định khi các toán tử quá tải cho các lớp mẫu
class foo
{
public:
foo() = default;
foo(int that)
{}
foo& operator +=(foo rhs)
{
return *this;
}
};
foo operator +(foo lhs, foo rhs)
{
lhs += rhs;
return lhs;
}
Đúng như dự đoán, những dòng sau biên dịch một cách chính xác:
foo f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // OK
f = 5 + f; // OK
Mặt khác, khi lớp foo
được khai báo là một mẫu đơn giản như thế này:
template< typename T >
class foo
{
public:
foo() = default;
foo(int that)
{}
foo& operator +=(foo rhs)
{
return *this;
}
};
template< typename T >
foo<T> operator +(foo<T> lhs, foo<T> rhs)
{
lhs += rhs;
return lhs;
}
Các dòng sau biên dịch với các lỗi:
foo<int> f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // Error (no match for operator+)
f = 5 + f; // Error (no match for operator+)
Tôi muốn hiểu tại sao trình biên dịch (GCC 4.6.2) không thể thực hiện chuyển đổi kiểu ngầm bằng cách sử dụng hàm tạo chuyển đổi cho phiên bản mẫu của lớp. Đó có phải là hành vi mong đợi không? Ngoài việc tạo thủ công tất cả các tình trạng quá tải cần thiết, có cách nào khác cho việc này không?
Bạn có thể thêm một tình trạng quá tải cho T: foo < T > operator + (foo < T > LHS, T RHS) –