Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tại sao template C++ chỉ có thể triển khai trong file header?


Khi bạn khởi tạo một template trong C++, trình biên dịch tạo ra một lớp mới. Lớp này có tất cả các chỗ chứa tham số template được thay thế bằng đối số thực tế bạn truyền vào. Ví dụ:

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

Khi sử dụng lớp này ở đâu đó trong chương trình:

MyClass<int> x;

Trình biên dịch tạo ra một lớp mới mỗi khi gặp một đối số template khác nhau. Nếu bạn tạo 3 đối tượng với 3 đối số template khác nhau, bạn sẽ có 3 lớp, tương đương với:

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

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