2013-03-13 17 views
28

मैं टेम्पलेट्स में नया हूं इसलिए शायद यह एक छोटी सी चीज है लेकिन मैं इसे काम नहीं कर सकता। मैं कक्षा सदस्य समारोह के आंशिक विशेषज्ञता प्राप्त करने की कोशिश कर रहा हूं। सबसे छोटा कोड होगा:सी ++ टेम्पलेट आंशिक विशेषज्ञता सदस्य समारोह

template <typename T, int nValue> class Object{ 
private: 
    T m_t; 
    Object(); 
public: 
    Object(T t): m_t(t) {} 
    T Get() { return m_t; } 
    Object& Deform(){ 
     m_t*=nValue; 
     return *this; 
    } 
}; 

template <typename T> 
Object<T,0>& Object<T,0>::Deform(){ 
    this->m_t = -1; 
    return *this; 
} 

int main(){ 
    Object<int,7> nObj(1); 
    nObj.Deform(); 
    std::cout<<nObj.Get(); 
} 

मैंने गैर-कार्य कार्यों के साथ प्रयास किया और यह ठीक काम किया। जो भी ठीक काम करता है वह सदस्य फ़ंक्शन का पूर्ण विशेषज्ञता है।

लेकिन, जब भी मैं आंशिक स्पेक के साथ प्रयास करता हूं। एक सदस्य समारोह की मैं फार्म की त्रुटि मिलती है:

PartialSpecification_MemberFu.cpp(17): error: template argument 
list must match the parameter list Object<T,0>& Object<T,0>::Deform(). 

:-)

+1

भी प्रासंगिक: http://stackoverflow.com/questions/1501357/template-specialization-of-particular-members –

उत्तर

30

किसी भी मदद की सराहना करते हैं आप आंशिक रूप से केवल एक ही सदस्य समारोह विशेषज्ञ नहीं कर सकते, आप आंशिक रूप से पूरी कक्षा विशेषज्ञ होना चाहिए।

template <typename T> 
class Object<T, 0> 
{ 
private: 
    T m_t; 
    Object(); 
public: 
    Object(T t): m_t(t) {} 
    T Get() { return m_t; } 
    Object& Deform() 
    { 
     std::cout << "Spec\n"; 
     m_t = -1; 
     return *this; 
    } 
}; 
18

14.5.5.3.1: इसलिए आप की तरह कुछ की आवश्यकता होगी। क्लास टेम्पलेट आंशिक विशेषज्ञता के सदस्य की टेम्पलेट पैरामीटर सूची क्लास टेम्पलेट आंशिक विशेषज्ञता की टेम्पलेट पैरामीटर सूची से मेल खाती है। क्लास टेम्पलेट आंशिक विशेषज्ञता के सदस्य की टेम्पलेट तर्क सूची क्लास टेम्पलेट आंशिक विशेषज्ञता की टेम्पलेट तर्क सूची से मेल खाती है।

दूसरे शब्दों में: आंशिक रूप से विशिष्ट वर्ग के बिना आंशिक रूप से विशेष सदस्य नहीं।

3

दुर्भाग्यवश, आप आंशिक रूप से टेम्पलेट वर्ग के सदस्य फ़ंक्शन को विशेषज्ञ नहीं कर सकते हैं। आप या तो आंशिक रूप से पूरी कक्षा का विशेषज्ञ हो सकते हैं या विरासत का उपयोग कर सकते हैं। आप दोनों का उपयोग कर सकते हैं:

template <typename T, int nValue> 
class Object { 
protected: 
    T m_t; 
public: 
    Object() = delete; 
    Object(T t): m_t(t) {} 
    T Get() { return m_t; } 
    Object& Deform() { 
     m_t *= nValue; 
     return *this; 
    } 
}; 

template <typename T> 
class Object<T,0> : public Object<T,1> { 
public: 
    using Object<T,1>::Object; 

    Object& Deform() { 
     this->m_t = -1; 
     return *this; 
    } 
}; 
संबंधित मुद्दे