Khi tôi biên dịch các thông tin sau với g++ --std=c++98 -Wall -Werror -Wpedantic Test.cc
, không có lỗi.Phương thức lớp mẫu không gây ra lỗi - là phần này của tiêu chuẩn?
template <class T>
struct TemplateClass {
T *ptr;
TemplateClass(T *p): ptr(p) {}
int foo() {
return ptr->bar();
}
};
struct ExampleClass {
};
int main() {
TemplateClass<ExampleClass> x(new ExampleClass());
}
tôi mong đợi rằng trình biên dịch sẽ phàn nàn rằng ExampleClass
không thực hiện phương pháp bar
.
Nhưng có vẻ như nó chỉ phàn nàn nếu tôi thực sự sử dụng phương thức foo
.
Tôi có thể dựa vào hành vi này trên bất kỳ trình biên dịch C++ 98 và C++ 11 nào không?
Sự hiểu biết của tôi về các mẫu trước đó là bất cứ khi nào một mẫu được khởi tạo, toàn bộ nội dung được sao chép với T
được thay thế bằng đối số mẫu. Đây không phải là cách mẫu hoạt động?
Tôi nghĩ điều này là do các mẫu được đánh giá tại thời gian biên dịch và không có bất kỳ kiểm tra ràng buộc nào. – callyalater