আসুন একটি উদাহরণ নেওয়া যাক, আপনি কোনও টেম্পলেট ক্লাস করতে চান এমন কোনও কারণে আসুন:
//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");
}
আপনি যদি ভিজ্যুয়াল স্টুডিওতে এই কোডটি সংকলন করেন - এটি বাক্সের বাইরে কাজ করে। জিসিসি লিঙ্কার ত্রুটি তৈরি করবে (যদি একই শিরক ফাইলটি একাধিক .cpp ফাইলগুলি থেকে ব্যবহৃত হয়):
error : multiple definition of `DemoT<int>::test()'; your.o: .../test_template.h:16: first defined here
বাস্তবায়নটিকে .cpp ফাইলে স্থানান্তরিত করা সম্ভব, তবে তারপরে আপনাকে এই জাতীয় ক্লাস ঘোষণা করতে হবে -
//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>;
এবং তারপরে .cpp এর মতো দেখতে পাবেন:
//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");
}
শিরোনাম ফাইলে দুটি শেষ লাইন ছাড়া - জিসিসি ভাল কাজ করবে, তবে ভিজ্যুয়াল স্টুডিও একটি ত্রুটি তৈরি করবে:
error LNK2019: unresolved external symbol "public: void __cdecl DemoT<int>::test(void)" (?test@?$DemoT@H@@QEAAXXZ) referenced in function
আপনি .dll রফতানির মাধ্যমে ফাংশনটি প্রকাশ করতে চাইলে টেমপ্লেট শ্রেণীর বাক্য গঠনটি optionচ্ছিক, তবে এটি কেবল উইন্ডোজ প্ল্যাটফর্মের জন্যই প্রযোজ্য - সুতরাং test_template.h এর মতো দেখতে পারা যায়:
//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();
পূর্ববর্তী উদাহরণ থেকে .cpp ফাইল সহ।
এটি লিঙ্কারে আরও মাথা ব্যাথা দেয়, সুতরাং যদি আপনি .dll ফাংশন রফতানি না করেন তবে পূর্ববর্তী উদাহরণটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।