जब आप C++ में एक टेम्प्लेट को इंस्टेंशिएट करते हैं, तो कंपाइलर एक नई क्लास बनाता है। इस क्लास में वे सभी स्थान जहां आपने टेम्प्लेट आर्गुमेंट्स रखे थे, उन्हें आपके द्वारा उपयोग करते समय पास किए गए वास्तविक आर्गुमेंट से बदल दिया जाता है। उदाहरण के लिए –
template<typename T> class MyClass {
T foo;
T myMethod(T arg1, T arg2) {
// Impl
}
};
और आपके प्रोग्राम में कहीं इस क्लास का उपयोग करें,
MyClass<int> x;
कंपाइलर हर उस टाइप आर्गुमेंट के लिए एक नई क्लास बनाता है जिसे आप इसे पास करते हैं। उदाहरण के लिए, यदि आपने अलग-अलग टेम्प्लेट आर्गुमेंट्स के साथ 3 ऑब्जेक्ट बनाए, तो आपको 3 क्लास मिलेंगी, जो निम्न के बराबर होंगी –
class MyClassInt {
int foo;
int myMethod(int arg1, int arg2) {
// Impl
}
};
ऐसा करने के लिए, कंपाइलर को क्लास और मेथड्स के इम्प्लीमेंटेशन तक पहुंच की आवश्यकता होती है, इससे पहले कि वह ऐसे स्टेटमेंट्स का सामना करे, ताकि उन्हें टेम्प्लेट आर्गुमेंट (इस मामले में int) के साथ इंस्टेंशिएट किया जा सके। यदि ये टेम्प्लेट क्लास इम्प्लीमेंटेशन हेडर में नहीं होते, तो वे एक्सेसिबल नहीं होते और इसलिए कंपाइल नहीं होंगे।