Bir örnek verelim, bir nedenden dolayı bir şablon sınıfına sahip olmak istediğinizi varsayalım:
//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");
}
Bu kodu Visual Studio ile derlerseniz - kutunun dışında çalışır. gcc, bağlayıcı hatası üretir (birden çok .cpp dosyasından aynı başlık dosyası kullanılırsa):
error : multiple definition of `DemoT<int>::test()'; your.o: .../test_template.h:16: first defined here
Uygulamayı .cpp dosyasına taşımak mümkündür, ancak daha sonra böyle bir sınıf bildirmeniz gerekir -
//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>;
Ve sonra .cpp şöyle görünecektir:
//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");
}
Başlık dosyasında son iki satır olmadan - gcc düzgün çalışır, ancak Visual studio bir hata oluşturur:
error LNK2019: unresolved external symbol "public: void __cdecl DemoT<int>::test(void)" (?test@?$DemoT@H@@QEAAXXZ) referenced in function
.dll dışa aktarma yoluyla işlevi göstermek istiyorsanız şablon sınıfı sözdizimi isteğe bağlıdır, ancak bu yalnızca Windows platformu için geçerlidir - bu nedenle test_template.h şöyle görünebilir:
//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();
önceki örnekten .cpp dosyasıyla.
Ancak bu, bağlayıcıya daha fazla baş ağrısı verir, bu nedenle .dll işlevini dışa aktarmazsanız önceki örneği kullanmanız önerilir.