2011-11-21 14 views
14

मैंने केवल CRTP के बारे में विकी आलेख पढ़ा है, और मैं टेम्पलेट त्वरण के बारे में थोड़ा उलझन में हूं।कक्षा टेम्पलेट तत्काल

विकि के अनुसार,

सदस्य समारोह निकायों (परिभाषाओं) लंबे उनकी घोषणाओं के बाद जब तक instantiated नहीं कर रहे हैं।

मुझे समझ में नहीं आता कि इसका क्या अर्थ है।

मान लीजिए मैं एक वर्ग टेम्पलेट मिल गया:

template <typename T> 
class A 
{ 
    public: 
     void foo(T t) 
     { 
      //... 
     }; 
}; 

जब मैं कक्षा टेम्पलेट एक दृष्टांत है, यह सदस्य समारोह foo का दृष्टांत है()?

उदाहरण के लिए:

प्रारंभ होता है संकलन दौरान, नहीं रनटाइम के दौरान:

//in .cpp file 
int main() 
{ 
    A<int> a; //question 1 
       //class template is instantiated here, isn't it? 
       //What about foo(), is it instantiated too? 

    a.foo(10); //question 2 
       //according to the quotation, foo() will not be instantiated until it is used. 
       //if so, foo() is instantiated right here, not in question 1, right? 
} 
+2

प्लग: यह आपके सवालों के जवाब हो सकता है: http: // stackoverflow।कॉम/प्रश्न/718235 9/टेम्पलेट-तत्काल-विवरण-के-जीसीसी-एंड-एमएस-कंपाइलर्स/7241548 # 7241548 –

उत्तर

12

आप एक बात भ्रमित कर रहे हैं। इसलिए आप "किस लाइन पर" एक वर्ग टेम्पलेट या फ़ंक्शन टेम्पलेट को तत्काल नहीं कह सकते हैं।

यह कहा गया है कि, आप इस तथ्य के बारे में सही हैं कि सदस्य फ़ंक्शन टेम्पलेट्स क्लास टेम्पलेट्स के साथ तत्काल नहीं हैं।

आप इस तरह के एक मामले में यह देख सकता: आप निम्न फ़ाइलें

  • template.h (परिभाषित करता है वर्ग ए और समारोह एक :: foo)
  • a.cpp (का उपयोग करता है ए)
  • है
  • b.cpp (ए और ए :: foo का उपयोग करता है)

फिर a.cpp के संकलन के दौरान, केवल ए को तुरंत चालू किया जाएगा। हालांकि, बी.पी.पी. के संकलन के दौरान, दोनों को तत्काल किया जाएगा।

इस कारण, यदि ए :: फू में टेम्पलेट पैरामीटर के दिए गए सेट के लिए कुछ अर्थात् अमान्य कोड शामिल है, तो आप b.cpp में संकलित त्रुटियां प्राप्त करेंगे, लेकिन a.cpp नहीं।

मुझे उम्मीद है कि चीजों को साफ़ कर देगा!

+0

मैं इसे अब समझता हूं, धन्यवाद। – Alcott

8

कक्षा टेम्पलेट्स के साथ, अंगूठे का नियम यह है कि केवल उन सदस्यों को तत्काल उपयोग किया जाता है जो वास्तव में उपयोग किए जाते हैं।

आप पूरा इन्स्टेन्शियशन चाहते हैं, सी ++ स्पष्ट इन्स्टेन्शियशन (हालांकि, आमतौर पर तुम नहीं प्रदान करता है, तथ्य यह है कि नहीं हर बिट पूरी तरह से instantiated है मतलब है कि आपके टेम्पलेट वर्ग भी अधिक सामान्य है, क्योंकि यह पर T आवश्यकताओं को कम करती है , ध्यान दें कि गैर-निर्भर प्रकारों की सिंटैक्स जांच और लुकअप (सामान जो T पर निर्भर नहीं है) अभी भी होता है)।

आप एक अधिक पूरा जवाब यहाँ मिलेगा: Template instantiation details of GCC and MS compilers

+0

स्पष्ट तात्कालिक बल पूर्ण तत्काल का उल्लेख करने के लिए उपरोक्त – FaceBro

संबंधित मुद्दे