2013-04-22 6 views
13

के लिए पॉइंटर आंशिक विशेषज्ञता करते समय "स्पष्ट टेम्पलेट तर्कों का अवैध उपयोग" प्राप्त करना हैलो मुझे आंशिक विशेषज्ञता के साथ समस्याएं आ रही हैं। मैं जो करना चाहता हूं वह एक वर्ग है जिसमें टेम्पलेट सदस्य फ़ंक्शन है जो उपयोगकर्ता द्वारा निर्दिष्ट किसी दिए गए मान की व्याख्या करेगा। मिसाल के तौर पर वर्ग के नाम Value है और यहाँ है कि मैं क्या करना चाहते हैं का एक टुकड़ा है:कक्षा विधि

struct Value { 

    Value(void *p) : val1(p){} 
    Value(int i) : val2(i){} 

    template<typename T> 
    T getValue(); 

    void *val1; 
    int val2; 
}; 

template<typename T> 
T* Value::getValue<T*>() { 
    return reinterpret_cast<T*>(val1); 
} 

template<> 
int Value::getValue<int>() { 
    return val2; 
} 

जब मैं संकलन मैं हो रही है निम्नलिखित:

int *ptr1 = new int; 
*ptr1 = 10; 
Value val1 = ptr1; 
int *ptr2 = val1.getValue<int*>(); 

Value val2 = 1; 
int testVal = val2.getValue<int>(); 

यहाँ कैसे मैं ऐसे वर्ग को लागू किया है त्रुटि:

:

error C2768: 'Value::getValue' : illegal use of explicit template arguments

मूल रूप से अपने कोड का सूचक टेम्पलेट भाग के बारे में शिकायत

template<typename T> 
T* Value::getValue<T*>() { 
    return reinterpret_cast<T*>(val1); 
} 

मुझे पता है कि इस समस्या को एक साधारण संघ के साथ कार्यान्वित किया जा सकता है, लेकिन यह कोड एक बड़े कोड का एक अलग संस्करण है।

क्या कोई जानता है कि समस्या क्या हो सकती है? मैं पॉइंटर्स का उपयोग नहीं करते समय पॉइंटर्स और अन्य का उपयोग करते समय अलग-अलग कोड करना चाहता हूं। मैं वास्तव में अटक गया हूं और मैं हमेशा पूछने की बजाय जांच करता हूं, लेकिन मुझे इसके बारे में कोई अच्छी जानकारी नहीं मिली है।

+3

फ़ंक्शन टेम्पलेट आंशिक रूप से विशिष्ट नहीं हो सकते हैं; केवल वर्ग टेम्पलेट्स हो सकते हैं। – Angew

+0

ठीक है हाँ शायद यह है। मुझे सी ++ आधुनिक डिजाइन में इसके बारे में पढ़ना याद है, यह कार्य आंशिक नहीं हो सकता है। मैंने सोचा क्योंकि सदस्य कार्य जहां कक्षा का हिस्सा आप इससे दूर हो सकते हैं। मुझे नहीं लगता :(धन्यवाद: डी – Kunashu

उत्तर

13

फ़ंक्शन टेम्पलेट्स आंशिक रूप से विशिष्ट नहीं हो सकते हैं, लेकिन अधिकांश समय, आप प्रतिनिधि-से-क्लास चाल का उपयोग कर सकते हैं। आप में उदाहरण के लिए यह होगा:

struct Value { 
    template<typename T> 
    T getValue() { 
    return Impl_getValue<T>::call(*this); 
    } 
}; 

template <typename T> 
struct Impl_getValue 
{ 
    static T call(Value &v) { 
    //primary template implementation 
    } 
}; 

template <typename T> 
struct Impl_getValue<T*> 
{ 
    static T* call(Value &v) { 
    return reinterpret_cast<T*>(v.val1); 
    } 
}; 
+0

मेरे पास एक सवाल है, क्या कंपाइलर Impl_getValue :: कॉल()? – Kunashu

+0

@ कुनाशु को अतिरिक्त कॉल हटा देगा यदि ऑप्टिमाइज़र कुछ भी लायक है, तो यह ऐसी कॉल को हटा देगा। – Angew

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