Hãy xem xét mã sau đây.Tại sao trình biên dịch không thực hiện chuyển đổi kiểu?
#include <iostream>
#include <string>
struct SimpleStruct
{
operator std::string() { return value; }
std::string value;
};
int main()
{
std::string s; // An empty string.
SimpleStruct x; // x.value constructed as an empty string.
bool less = s < x; // Error here.
return 0;
}
Mã này không biên dịch trên g ++ hoặc Microsoft Visual C++. Báo cáo lỗi do trình biên dịch cung cấp là no match for operator '<' in 's < x'
. Câu hỏi đặt ra là tại sao trình biên dịch không chỉ đơn giản là chuyển đổi SimpleStruct x
thành string
theo operator string()
nhất định và sau đó sử dụng operator < (string, string)
?
+1, câu trả lời này là chính xác. 'string :: operator <()' không nhận tham số là 'const string &', nhưng 'basic_string <>'; nếu bạn quá tải 'toán tử <' trên toàn cầu thì nó hoạt động. http://www.ideone.com/vMERa – iammilind
Eh, 'std :: string' chỉ là một typedef cho' std :: basic_string '. 'typedef' không giới thiệu một kiểu mới, và do đó không ảnh hưởng đến quá tải. –
MSalters
Vấn đề cơ bản là việc khấu trừ 'charT' trong' template toán tử bool <(std :: basic_string const & lhs, std :: basic_string const & rhs); 'không thành công. Không có' charT' mà 'basic_string ' _equals_ 'SimpleStruct' thực sự loại bỏ nó khỏi tập quá tải. –
MSalters