Computer >> Máy Tính >  >> Lập trình >> C ++

Tại sao các mẫu C ++ chỉ có thể được triển khai trong tệp tiêu đề?


Khi bạn khởi tạo một mẫu trong C ++, trình biên dịch sẽ tạo một lớp mới. Lớp này có tất cả các vị trí mà bạn đã đặt các đối số mẫu được thay thế bằng đối số thực tế mà bạn chuyển cho nó khi sử dụng nó. Ví dụ: -

template<typename T> class MyClass {
   T foo;
   T myMethod(T arg1, T arg2) {
      // Impl
   }
};

Và một nơi nào đó trong chương trình của bạn sử dụng lớp này,

MyClass<int> x;

Trình biên dịch tạo một lớp mới khi gặp phải điều này cho mọi đối số kiểu mà bạn chuyển nó. Ví dụ:nếu bạn tạo 3 đối tượng với các đối số mẫu khác nhau, bạn sẽ nhận được 3 lớp, tương đương với -

class MyClassInt {
   int foo;
   int myMethod(int arg1, int arg2) {
      // Impl
   }
};

Để làm như vậy, trình biên dịch cần có quyền truy cập vào việc triển khai lớp và các phương thức trước khi nó gặp các câu lệnh như vậy, để khởi tạo chúng bằng đối số mẫu (trong trường hợp này là int). Nếu các triển khai lớp mẫu này không có trong tiêu đề, chúng sẽ không thể truy cập được và do đó sẽ không biên dịch được.