2010-09-19 3 views
9
template<typename T1, typename T2> 
class Bimap { 
public: 
    class Data { 
    private: 
     template<typename T> Data& set(T); 
     template<> Data& set<T1>(typename T1 v) { /*...*/ } 
    }; 
}; 

जो मुझे त्रुटि देता है "गैर नाम स्थान दायरे में स्पष्ट विशेषज्ञता":सी ++: त्रुटि

error: explicit specialization in non-namespace scope 'class Bimap<T1, T2>::Data'

मैं समझता हूँ कि क्या त्रुटि कह रहा है। लेकिन मैं ऐसा क्यों नहीं कर सकता? और मैं इसे कैसे ठीक कर सकता हूं?

+2

यह ध्यान देने योग्य है कि कुछ कंपाइलर्स इसका समर्थन करेंगे। – Puppy

+1

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

उत्तर

14

एक तरह से भूल जाते हैं टेम्पलेट्स, अधिभार:

Data& set(T1 v) { /*...*/ } 

लेकिन यहाँ एक चाल है जो मैं कभी कभी का उपयोग है

आप वर्ग के भीतर वर्ग टेम्पलेट विशेषज्ञ कर सकते हैं:

class { 
    template<typename T> 
    struct function_ { 
     static void apply(T); 
    }; 

    template<> 
    struct function_<int> { 
     ... 
    }; 

    template<typename T> 
    void function(T t) { return function_<T>::apply(t); } 
+0

+1, हाँ, फ़ंक्शन टेम्पलेट विशेषज्ञता प्राप्त करने का एकमात्र तरीका है। –

+4

आप * * सामान्य * कक्षा के भीतर एक नेस्टेड क्लास टेम्पलेट को स्पष्ट रूप से विशेषज्ञ कर सकते हैं। लेकिन आप * किसी अन्य * वर्ग टेम्पलेट * के भीतर एक नेस्टेड क्लास टेम्पलेट को स्पष्ट रूप से विशेषज्ञ नहीं कर सकते *। उत्तरार्द्ध करने का एकमात्र तरीका स्पष्ट रूप से * दोनों * संलग्न टेम्पलेट और नेस्टेड टेम्पलेट का विशेषज्ञ है। – AnT

+0

@Andrey मैं टेम्पलेट वर्ग के अंदर टेम्पलेट वर्ग के बारे में निश्चित नहीं था। किसी भी दर पर, चाल की कुछ भिन्नता शायद बनाई जा सकती है – Anycorn

0

@Albert

मुझे एक ही समस्या थी जब मैं एक कस्टम के लिए "ट्रिम-अतिरिक्त-क्षमता" जोड़ना चाहता था कंटेनर बनाया Std :: वेक्टर स्वैप चाल और मौजूदा कंटेनर की घोषणा बदलना वैध विकल्प नहीं थे। तो मैं इस के साथ आ गया है:

template <class T, bool isPtr> struct DeleteImp 
{ 
    static void Trim(T* to, unsigned int count); 
}; 

template <class T> struct DeleteImp<T, false>  
{ 
    static void Trim(T* to, unsigned int count) {} 
}; 

template <class T> struct DeleteImp<T, true>   
{ 
    static void Trim(T* to, unsigned int count) 
    { 
     for(unsigned int i=0; i<count; i++) 
      delete to[i]; 
    } 
}; 

इस तरह मेरी कंटेनर द्वारा इस्तेमाल किया:

DeleteImp<T, TypeTraits<T>::isPointer>::Trim(buf + length, truelength-length); 

इस resource की जाँच कर सकते हैं।

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