चित्र 1: फ़ंक्शन टेम्प्लेट
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
क्या यह उपयोग करने का सही तरीका है extern template
, या क्या मैं इस कीवर्ड का उपयोग केवल कक्षा के टेम्पलेट्स के लिए करता हूं जैसा कि चित्र 2 में है?
चित्र 2: वर्ग टेम्पलेट
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
मुझे पता है कि यह सब एक हेडर फाइल में डालना अच्छा है, लेकिन अगर हम एक से अधिक फाइलों में एक ही पैरामीटर के साथ टेम्पलेट्स को त्वरित करते हैं, तो हमें कई समान परिभाषाएं मिलीं और कंपाइलर त्रुटियों से बचने के लिए उन सभी (एक को छोड़कर) को हटा देगा। मैं कैसे उपयोग extern template
करूं? क्या हम इसे केवल कक्षाओं के लिए उपयोग कर सकते हैं, या हम इसे कार्यों के लिए भी उपयोग कर सकते हैं?
इसके अलावा, चित्र 1 और चित्र 2 को एक समाधान में विस्तारित किया जा सकता है जहां टेम्पलेट एक ही हेडर फ़ाइल में होते हैं। उस स्थिति में, हमें extern template
कई समान इंस्टेंसेस से बचने के लिए कीवर्ड का उपयोग करना होगा । क्या यह केवल कक्षाओं या कार्यों के लिए ही है?
extern template class foo<int>();
एक गलती की तरह लगता है।
()
बाहरी लाइन के पास 'अपेक्षित अयोग्य-आईडी' कहता है । आपकी पुस्तक और दृश्य स्टूडियो दोनों ही गलत हैं, अधिक मानक अनुरूप संकलक का उपयोग करने की कोशिश करें जैसे कि जी ++ या क्लैंग और आप समस्या देखेंगे।