Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ทำไม C++ Templates ถึงต้อง реализоватьในไฟล์ Header เท่านั้น?

เมื่อคุณสร้างอินสแตนซ์ (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 พวกมันจะเข้าถึงไม่ได้และจึงคอมไพล์ไม่ผ่าน