เมื่อคุณสร้างอินสแตนซ์ (instantiate) เทมเพลตใน 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
}
};
เพื่อทำเช่นนี้ คอมไพเลอร์ต้องเข้าถึงการนำไปใช้ (implementation) ของคลาสและเมธอด ก่อน ที่จะเจอคำสั่งดังกล่าว เพื่อสร้างอินสแตนซ์ด้วยอาร์กิวเมนต์เทมเพลต (ในกรณีนี้คือ int) หากการนำไปใช้ของคลาสเทมเพลตไม่อยู่ในไฟล์ header พวกมันจะเข้าถึงไม่ได้และจึงคอมไพล์ไม่ผ่าน