Tôi gặp khó khăn trong việc hiểu các điều kiện trong đó C++ sẽ sử dụng chuyển đổi ngầm định. Giả sử tôi có một lớp học:Chuyển đổi ngầm C++ trong toán hạng sang toán tử chuẩn
class SomeClass
{
private:
int val;
public:
SomeClass(int i) :val{ i } {}
operator string() { return to_string(val); }
};
Tại sao khi sử dụng lớp này với toán tử tôi cần truyền tới chuỗi? Tại sao nó không thực hiện chuyển đổi hoàn toàn?
mã:
int main(void)
{
SomeClass sc = 4;
cout << (string)sc << endl; //prints 4, compiles fine
cout << sc << endl;//does not compile, no operator "<<" matches these operands
string str1 = sc;//compiles fine, performs cast
string str2 = "Base String" + sc;//does not compile, no operator "+" matches these operands
}
Câu hỏi này là học tập nhiều hơn thực tế như chỉ sử dụng một dàn diễn viên là dễ đọc hơn anyway.
Vì vậy, để tương thích hơn với các hàm thư viện chuẩn C++ (không có phôi), tôi nên viết các chuyển đổi ngầm đến 'basic_string' và không phải chuỗi? –
@ApoorvaKharche Không, 'string' là một typedef cho một instantiation cụ thể của' basic_string'. Liệu toán tử << 'được viết dưới dạng' basic_string 'hay về' chuỗi' không tạo ra bất kỳ sự khác biệt nào, vì chúng có nghĩa là chính xác điều tương tự. Liệu toán tử << 'có được viết dưới dạng' basic_string 'hoặc' basic_string 'trong đó' T' được suy ra không tạo ra sự khác biệt, và bạn không kiểm soát được điều đó từ lớp của riêng bạn. –
hvd