मेरे पास एक टेम्पलेट क्लास है जिसे मैं एक विधि के साथ शीर्षलेख में घोषित करता हूं और शीर्षलेख में उस विधि की कोई परिभाषा नहीं देता हूं। एक .cc फ़ाइल में, मैं उस विधि के विशेषज्ञों को कभी भी शीर्षलेख में घोषित किए बिना परिभाषित करता हूं। एक अलग .cc फ़ाइल में, मैं विभिन्न टेम्पलेट पैरामीटर के लिए विधि को कॉल करता हूं जिसके लिए विशेषज्ञता मौजूद है। यह इस तरह दिखता है:हेडर में घोषणा के बिना टेम्पलेट क्लास सदस्य विशेषज्ञता
foo.h:
template<typename T>
class Foo {
public:
static int bar();
};
foo.cc:
#include "foo.h"
template<>
int Foo<int>::bar() {
return 1;
}
template<>
int Foo<double>::bar() {
return 2;
}
main.cc:
#include <iostream>
#include "foo.h"
int main(int argc, char **argv) {
std::cout << Foo<int>::bar() << std::endl;
std::cout << Foo<double>::bar() << std::endl;
return 0;
}
इस कार्यक्रम जीसीसी के साथ संकलित करता है तथा लिंक सफलतापूर्वक सभी सी ++ मानकों के लिए 4.7.2 (सी ++ 98, gnu ++ 98, सी ++ 11, और gnu ++ 11)। आउटपुट है:
1
2
यह मुझे समझ में आता है। चूंकि main.cc अनुवाद इकाई को bar()
या किसी भी विशेषज्ञता की परिभाषा नहीं दिखाई देती है, इसलिए यह bar()
पर किसी अन्य अनुवाद इकाई में bar()
की एक विशेषीकृत परिभाषा के स्पष्ट तत्काल उपयोगों की अपेक्षा करने के लिए कॉल की अपेक्षा करता है। लेकिन चूंकि नाम उलझन में अनुमान लगाया जा सकता है, foo.cc में विशेषज्ञताएं समान प्रतीक नामों के समान तत्काल परिभाषा के समान प्रतीक नाम हैं, इसलिए main.cc उन विशेषज्ञताओं का उपयोग करने में सक्षम है, जिन्हें कभी भी उस अनुवाद इकाई में घोषित नहीं किया जाता है।
मेरा प्रश्न यह है: क्या यह एक दुर्घटना है, या यह व्यवहार सी ++ मानक द्वारा अनिवार्य है? दूसरे शब्दों में, क्या यह कोड पोर्टेबल है?
सबसे प्रासंगिक पूर्व प्रश्न जो मुझे मिल सकता है Declaration of template class member specialization है, लेकिन इसमें इस विशेष मामले को शामिल नहीं किया गया है।
(यदि आप सोच रहे हैं कि यह मेरे लिए क्यों मायने रखता है, तो ऐसा इसलिए है क्योंकि मैं इस तरह के कोड का उपयोग संकलन-समय लुक-अप तालिका के रूप में कर रहा हूं और यदि मैं विशेषज्ञता घोषित नहीं करता तो यह बहुत छोटा है ।)
यह एक अच्छा पहला सवाल है! मुझे लगता है कि आईबीएम का कंपाइलर आपको बाहरी कीवर्ड का उपयोग करके अपनी विशेषज्ञता घोषित करने की अनुमति देता है, लेकिन इसे कभी नहीं किया। –