Hãy lấy một ví dụ, giả sử vì một số lý do bạn muốn có một lớp mẫu:
//test_template.h:
#pragma once
#include <cstdio>
template <class T>
class DemoT
{
public:
void test()
{
printf("ok\n");
}
};
template <>
void DemoT<int>::test()
{
printf("int test (int)\n");
}
template <>
void DemoT<bool>::test()
{
printf("int test (bool)\n");
}
Nếu bạn biên dịch mã này với Visual Studio - nó sẽ hoạt động tốt. gcc sẽ tạo ra lỗi liên kết (nếu cùng một tệp tiêu đề được sử dụng từ nhiều tệp .cpp):
error : multiple definition of `DemoT<int>::test()'; your.o: .../test_template.h:16: first defined here
Có thể di chuyển thực hiện sang tệp .cpp, nhưng sau đó bạn cần khai báo lớp như thế này -
//test_template.h:
#pragma once
#include <cstdio>
template <class T>
class DemoT
{
public:
void test()
{
printf("ok\n");
}
};
template <>
void DemoT<int>::test();
template <>
void DemoT<bool>::test();
// Instantiate parametrized template classes, implementation resides on .cpp side.
template class DemoT<bool>;
template class DemoT<int>;
Và sau đó .cpp sẽ trông như thế này:
//test_template.cpp:
#include "test_template.h"
template <>
void DemoT<int>::test()
{
printf("int test (int)\n");
}
template <>
void DemoT<bool>::test()
{
printf("int test (bool)\n");
}
Không có hai dòng cuối cùng trong tệp tiêu đề - gcc sẽ hoạt động tốt, nhưng Visual studio sẽ tạo ra lỗi:
error LNK2019: unresolved external symbol "public: void __cdecl DemoT<int>::test(void)" (?test@?$DemoT@H@@QEAAXXZ) referenced in function
cú pháp lớp mẫu là tùy chọn trong trường hợp nếu bạn muốn hiển thị chức năng thông qua xuất khẩu, nhưng điều này chỉ áp dụng cho nền tảng windows - vì vậy test_template.h có thể trông như thế này:
//test_template.h:
#pragma once
#include <cstdio>
template <class T>
class DemoT
{
public:
void test()
{
printf("ok\n");
}
};
#ifdef _WIN32
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
template <>
void DLL_EXPORT DemoT<int>::test();
template <>
void DLL_EXPORT DemoT<bool>::test();
với tập tin .cpp từ ví dụ trước.
Tuy nhiên, điều này gây đau đầu hơn cho trình liên kết, do đó, nên sử dụng ví dụ trước nếu bạn không xuất hàm.