Trong C++, mẫu chỉ là định nghĩa meta của một lớp thực tế. Khi bạn biên dịch một lớp templated, trình biên dịch thực sự tạo ra mã cho lớp thực tế đang chạy cho loại dữ liệu cụ thể được truyền vào (mẫu chỉ là một "mẫu" để sao chép).
ví dụ: Nếu bạn có các mã sau
struct MyTemplate
{
private:
float MyValue;
public:
float Get() { return MyValue; }
void Set(float value) { MyValue = value; }
};
void main()
{
MyTemplate v1;
MyTemplate v2;
v1.Set(5.0f);
v2.Set(2);
v2.Get();
}
gì trình biên dịch thực sự thấy là
struct CompilerGeneratedNameFor_MyTemplate_float
{
private:
float MyValue;
public:
float Get() { return MyValue; }
void Set(float value) { MyValue = value; }
};
struct CompilerGeneratedNameFor_MyTemplate_int
{
private:
int MyValue;
public:
int Get() { return MyValue; }
void Set(int value) { MyValue = value; }
};
void main()
{
CompilerGeneratedNameFor_MyTemplate_float v1;
CompilerGeneratedNameFor_MyTemplate_int v2;
v1.Set(5.0f);
v2.Set(2);
v2.Get();
}
Như bạn có thể thấy, trình biên dịch không thực sự biết những gì mã để tạo ra, cho đến khi bạn thực sự tuyên bố một thể hiện của mẫu của bạn. Điều này có nghĩa rằng mẫu không thể được biên dịch thành một thư viện, bởi vì nó không biết những gì các mẫu thực sự sẽ được kết thúc. Tin tốt về điều này là bạn không thực sự cần bất kỳ thư viện nào được biên soạn hoặc đưa vào nếu bạn chỉ phân phối các tệp tiêu đề có chứa định nghĩa mẫu.
Ngoài ra, như một lưu ý phụ, lệnh 'biên soạn trước' #include 'thực sự chỉ yêu cầu trình biên dịch trước thay thế' #include 'bằng mọi thứ từ tệp đó.
Nguồn
2009-03-08 14:45:37
Bạn nên viết một tập hợp các bài kiểm tra đơn vị hơn bằng cách buộc tạo một thư viện tĩnh không cần tồn tại. Sau khi tất cả, nhiều trình biên dịch sẽ bỏ lỡ các lỗi rất cơ bản trên mã mẫu nếu mã mẫu đó không được gọi. – Tom