दिलचस्प पोस्ट
मैं एमवीसी में आइटम्स की एक सूची कैसे पोस्ट कर सकता हूं समारोह में जावास्क्रिप्ट चर तर्कों की संख्या एल 1 कैश में Haswell पर चोटी बैंडविड्थ प्राप्त करना: केवल 62% प्राप्त करना पाप्लोट के साथ एक सर्कल का प्लॉट करें जावास्क्रिप्ट में HTML तत्व का शैली मान कैसे प्राप्त करें? मैं दो छवियों के बीच अंतर कैसे तय करूं? जावा में मौजूदा कार्यरत निर्देशिका को बदलना? अजगर में बैकस्लैश-एस्केप स्ट्रिंग से मैं कैसे बच निकलो? जमा करने के बाद JSF फॉर्म इनपुट मान साफ़ करें सी # में वर्तमान उपयोगकर्ता समय क्षेत्र कैसे प्राप्त करें मेटप्ललिब में कई सबप्लेट के साथ सबप्लॉट आकार / रिक्तियां सुधारें हमें बॉडी और यूआरआई से निर्दिष्ट क्यों करना है? C ++ अंतर्निहित प्रतिलिपि निर्माता जो कि अन्य वस्तुओं वाले वर्ग के लिए सूची में खोजदृश्य एक कस्टम एडाप्टर होने यूनिट्स के लिए लिनक्स बनाम ग्रुपजॉइन में शामिल हों

टेम्पलेट वर्ग सदस्य समारोह का स्पष्ट विशेषज्ञता

मुझे कुछ प्रकार के लिए टेम्प्लेट सदस्य फ़ंक्शन के विशेषज्ञ की आवश्यकता है (चलो दो कहते हैं)। यह ठीक काम करता है, जबकि कक्षा X खुद टेम्प्लेट क्लास नहीं है, लेकिन जब मैं इसे टेम्प्लेट करता हूं, जीसीसी कॉम्पले-टाइम त्रुटियों को देना शुरू करता है

 #include <iostream> #include <cmath> template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() { } int main() { X<int> x; x.get_as(); } 

यहाँ त्रुटि संदेश है

 source.cpp:11:27: error: template-id 'get_as<double>' in declaration of primary template source.cpp:11:6: error: prototype for 'void X<C>::get_as()' does not match any in class 'X<C>' source.cpp:7:35: error: candidate is: template<class C> template<class T> void X::get_as() 

मैं इसे कैसे ठीक कर सकता हूं और यहां समस्या क्या है?

अग्रिम में धन्यवाद।

वेब के समाधान से एकत्रित समाधान "टेम्पलेट वर्ग सदस्य समारोह का स्पष्ट विशेषज्ञता"

यह उस तरह से काम नहीं करता है आपको निम्नलिखित कहने की आवश्यकता होगी, लेकिन यह सही नहीं है

 template <class C> template<> void X<C>::get_as<double>() { } 

विशेष रूप से विशिष्ट सदस्यों को उनके आसपास के क्लास टेम्प्लेट की ज़रूरत होती है, जो स्पष्ट रूप से विशेष रूप से विशेषज्ञ हैं। तो आपको निम्नलिखित कहने की ज़रूरत है, जो केवल X<int> के सदस्य के लिए विशेषज्ञ होगा

 template <> template<> void X<int>::get_as<double>() { } 

यदि आप आस-पास के टेम्प्लेट को अनसाइज्ड रखना चाहते हैं, तो आपके पास कई विकल्प हैं। मुझे अधिभार पसंद है

 template <class C> class X { template<typename T> struct type { }; public: template <class T> void get_as() { get_as(type<T>()); } private: template<typename T> void get_as(type<T>) { } void get_as(type<double>) { } }; 

यदि कोई std::enable_if इस्तेमाल करने में सक्षम है, तो हम std::enable_if पर निर्भर हो सकते हैं (प्रतिस्थापन विफलता एक त्रुटि नहीं है)

वह ऐसा काम करेगा:

 #include <iostream> #include <type_traits> template <class C> class X { public: template <class T, typename std::enable_if< ! std::is_same<double,T>::value>::type * = nullptr > void get_as(){ std::cout << "get as T" << std::endl; } template <class T, typename std::enable_if< std::is_same<double,T>::value>::type * = nullptr > void get_as(){ std::cout << "get as double" << std::endl; } }; int main() { X<int> d; d.get_as<double>(); return 0; } 

बदसूरत चीज यह है कि, इन सब सक्षम सक्षमताओं के साथ ही कंपाइलर के लिए एकमात्र विशेषज्ञता उपलब्ध होनी चाहिए अन्यथा असंबद्धता त्रुटि उत्पन्न होगी। यही वजह है कि डिफ़ॉल्ट व्यवहार "टी के रूप में प्राप्त करें" की भी आवश्यकता होती है, यदि सक्षम हो

सबसे पहले: आपको अपने क्लास टेम्प्लेट में घोषित किए गए get_as स्पेशलाइजेशन नहीं हैं, जो बाद में किसी कोड में परिभाषित किया जाए। तो पहले आपको यह करने की आवश्यकता है:

 template <class C> class X { public: template <class T> void get_as(); template <> void get_as<double>(); }; 

फिर विशेषज्ञता को परिभाषित करें:

 template <class C> template <> void X<C>::get_as<double>() { .... } 

लेकिन मैं इसे इस तरह परिभाषित करेगा:

 template <class C> class X { public: template <class T> void get_as() { // default implementation } template <> void get_as<double>() { // specialized implementation } }; 

ऊपर की तरफ काम न करें!

संपादित करें:

यह पता चला है कि फ़ंक्शन टेम्पलेट विशेषज्ञताओं को गैर-नाम स्थान के दायरे में, अर्थात वर्गों, कक्षा टेम्पलेट आदि में अनुमति नहीं है।

तो आप नामस्थान-स्कोप फ़ंक्शन टेम्पलेट के रूप में बना सकते हैं:

 template <class C> class X { public: } template <class T, class C> void get_as( X<C>& obj ) { // default implementation } template <class C> void get_as<double,C>( X<C>& obj ) { // specialized implementation }