2014-04-28 18 views
5

मैं टेम्पलेट के साथ कुछ वर्ग ने लिखा है:std :: हैश टेम्पलेट आंशिक विशेषज्ञता

template <class T, class Allocator = ::std::allocator<T> > 
class my_list; 

मैं लिखना चाहिए :: इस वर्ग के लिए std :: हैश specializtion। मैं उसे कैसे कर सकता हूँ? सरल आंशिक विशेषज्ञता:

namespace std { 
    template <class T, class Allocator> 
     class hash<my_list<T, Allocator> >{ 
     public : 
     size_t operator()(const my_list<T, Allocator> &x) const{ 
      return ...; 
     } 
    }; 
} 

लेकिन मैं नहीं साधारण आंशिक विशेषज्ञता है, क्योंकि यह सी ++ आईएसओ द्वारा निषिद्ध लिख सकते हैं:

आईएसओ/आईईसी 14882 तीसरा संस्करण 2011-09-01

17.6.4.2.1 नेमस्पेस std [namespace.std]

2 सी ++ प्रोग्राम का व्यवहार अपरिभाषित है यदि यह घोषित करता है ... किसी भी सदस्य वर्ग टेम्पलेट का स्पष्ट या आंशिक विशेषज्ञता मानक पुस्तकालय वर्ग या कक्षा टेम्पलेट।

मैं क्या कर सकता हूं?

उत्तर

11

आपके द्वारा उद्धृत किए गए अनुच्छेद लागू नहीं होते हैं। आप कक्षा टेम्पलेट (std::hash) का आंशिक रूप से विशेषज्ञता रखते हैं, सदस्य वर्ग टेम्पलेट मानक लाइब्रेरी क्लास या क्लास टेम्पलेट के विशेषज्ञ नहीं हैं।std::hash किसी भी वर्ग या कक्षा टेम्पलेट का सदस्य नहीं है।

अपने मामले के लिए, एक ही अनुभाग के अनुच्छेद 1 लागू होता है, और है कि विशेषज्ञता जब कम से कम एक उपयोगकर्ता-निर्धारित प्रकार शामिल है (जोर मेरा) की अनुमति देता है:

एक सी के व्यवहार ++ प्रोग्राम अगर अपरिभाषित है यह नेमस्पेस std के भीतर std या नेमस्पेस नामस्थान के लिए घोषणाओं या परिभाषाओं को जोड़ता है जब तक अन्यथा निर्दिष्ट नहीं किया जाता है। एक कार्यक्रम std नाम स्थान के लिए किसी भी मानक पुस्तकालय टेम्पलेट के लिए एक टेम्पलेट विशेषज्ञता जोड़ सकते हैं केवल यदि घोषणा उपयोगकर्ता-निर्धारित प्रकार पर निर्भर करता है और विशेषज्ञता मूल टेम्पलेट के लिए मानक पुस्तकालय आवश्यकताओं को पूरा करती है और उन्हें स्पष्ट निषिद्ध नहीं है।

+0

मुझे याद है कि सी ++ उपयोगकर्ता के लिए आंशिक विशेषज्ञता ":: std :: स्वैप (टी और, टी और)" को परिभाषित नहीं कर सकते। उन्हें नाम "टेम्प्लेट <कक्षा ए, कक्षा बी> कक्षा टी" के साथ नामस्थान पर नया स्वैप फ़ंक्शन परिभाषित करना चाहिए। मैंने सोचा कि यह वही स्थिति है। – user3098730

+3

@ user3098730 'std :: swap' एक * फ़ंक्शन * टेम्पलेट है, न कि * * * टेम्पलेट। फ़ंक्शन टेम्पलेट्स आंशिक रूप से विशिष्ट नहीं हो सकते हैं; यह भाषा के नियमों से मिलता है और 'std' से कोई लेना देना नहीं है। – Angew

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