Các mẫu C ++ nổi tiếng với việc tạo các thông báo lỗi dài, không thể đọc được. Tôi có một ý tưởng chung về lý do tại sao các thông báo lỗi mẫu trong C ++ rất tệ. Về cơ bản, vấn đề là lỗi không được kích hoạt cho đến khi trình biên dịch gặp cú pháp không được hỗ trợ bởi một loại nhất định trong mẫu. Ví dụ:
template <class T>
void dosomething(T& x) { x += 5; }
Nếu T
không hỗ trợ +=
toán tử, trình biên dịch sẽ tạo thông báo lỗi. Và nếu điều này xảy ra sâu trong một thư viện ở đâu đó, thông báo lỗi có thể dài hàng ngàn dòng.
Nhưng các mẫu C ++ về cơ bản chỉ là một cơ chế để gõ vịt thời gian biên dịch. Một lỗi mẫu C ++ về mặt khái niệm rất giống với lỗi loại thời gian chạy có thể xảy ra trong một ngôn ngữ động như Python. Ví dụ, hãy xem xét mã Python sau:
def dosomething(x):
x.foo()
Ở đây, nếu x
không có foo()
phương thức, trình thông dịch Python sẽ đưa ra một ngoại lệ và hiển thị dấu vết ngăn xếp cùng với thông báo lỗi khá rõ ràng cho biết sự cố. Ngay cả khi lỗi không được kích hoạt cho đến khi trình thông dịch nằm sâu bên trong một số chức năng của thư viện, thông báo lỗi thời gian chạy vẫn không ở đâu tệ như tiếng nôn không thể đọc được của trình biên dịch C ++ thông thường. Vậy tại sao trình biên dịch C ++ không thể rõ hơn về những gì đã sai? Tại sao một số thông báo lỗi mẫu C ++ theo nghĩa đen khiến cửa sổ bảng điều khiển của tôi cuộn trong hơn 5 giây?
clang++
nháy mắt).