आइए एक उदाहरण लेते हैं, आइए बताते हैं कि आप किस कारण से एक खाका बनाना चाहते हैं:
//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");
}
यदि आप विजुअल स्टूडियो के साथ इस कोड को संकलित करते हैं - यह आउट ऑफ बॉक्स काम करता है। gcc लिंकर त्रुटि उत्पन्न करेगा (यदि एक ही हेडर फ़ाइल का उपयोग कई .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");
}
हेडर फ़ाइल में दो अंतिम पंक्तियों के बिना - gcc ठीक काम करेगा, लेकिन विज़ुअल स्टूडियो एक त्रुटि उत्पन्न करेगा:
error LNK2019: unresolved external symbol "public: void __cdecl DemoT<int>::test(void)" (?test@?$DemoT@H@@QEAAXXZ) referenced in function
टेम्पलेट वर्ग वाक्यविन्यास मामले में वैकल्पिक है अगर आप .dll निर्यात के माध्यम से समारोह का पर्दाफाश करना चाहते हैं, लेकिन यह केवल विंडोज़ प्लेटफॉर्म के लिए लागू होता है - तो 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 फ़ंक्शन को निर्यात नहीं करते हैं तो पिछले उदाहरण का उपयोग करने की अनुशंसा की जाती है।