Mari kita ambil satu contoh, katakanlah untuk beberapa alasan Anda ingin memiliki kelas templat:
//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");
}
Jika Anda mengkompilasi kode ini dengan Visual Studio - itu bekerja di luar kotak. gcc akan menghasilkan kesalahan tautan (jika file header yang sama digunakan dari banyak file .cpp):
error : multiple definition of `DemoT<int>::test()'; your.o: .../test_template.h:16: first defined here
Dimungkinkan untuk memindahkan implementasi ke file .cpp, tetapi kemudian Anda harus mendeklarasikan kelas seperti ini -
//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>;
Dan kemudian .cpp akan terlihat seperti ini:
//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");
}
Tanpa dua baris terakhir dalam file header - gcc akan berfungsi dengan baik, tetapi Visual studio akan menghasilkan kesalahan:
error LNK2019: unresolved external symbol "public: void __cdecl DemoT<int>::test(void)" (?test@?$DemoT@H@@QEAAXXZ) referenced in function
sintaks kelas template adalah opsional jika Anda ingin mengekspos fungsi melalui ekspor .dll, tetapi ini hanya berlaku untuk platform windows - jadi test_template.h bisa terlihat seperti ini:
//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();
dengan file .cpp dari contoh sebelumnya.
Namun ini memberikan lebih banyak sakit kepala ke tautan, jadi disarankan untuk menggunakan contoh sebelumnya jika Anda tidak mengekspor fungsi .dll.