मैं उन्हें कई बार लिखने से बचने के लिए एक साथ विशेषज्ञता समूह बनाने की कोशिश कर रहा हूं। उदाहरण के लिए, नीचे दिए गए कोड में, मैं foo :: func() के कार्यान्वयन के एक मामले के रूप में "फ्लोट" और "डबल" विशेषज्ञ का प्रयास करने की कोशिश करता हूं; मैं फिर "बूल" के लिए एक और कार्यान्वयन का उपयोग करता हूं।इस आश्रित प्रकार को टेम्पलेट तर्क का उपयोग करके विशेषज्ञता के रूप में क्यों नहीं माना जाता है?
template<typename T> struct foo;
template<typename T> struct bar;
template<> struct bar<float> { typedef float Type; };
template<> struct bar<double> { typedef double Type; };
/* specialize for float and double here */
template<typename T> struct foo<typename bar<T>::Type> {
static void func() { ... }
};
template<> struct foo<bool> {
static void func() { ... }
};
यह त्रुटियां जीसीसी 4.4.3 में बाहर हैं। (यह एक लक्ष्य संकलक है, क्योंकि यह Ubuntu सर्वर 10.04 LTS है, जो कथित तौर पर तीन साल रहना पड़ता है के लिए शेयर है।) त्रुटि है:
foo.cpp:8: error: template parameters not used in partial specialization:
foo.cpp:8: error: ‘T’
त्रुटि ("के लिए foo की पहली विशेषज्ञता को दर्शाता है फ्लोट "और" डबल। ")
मुझे नहीं लगता कि सी ++ का मैं कौन सा हिस्सा यहां उल्लंघन कर रहा हूं - अगर कोई अध्याय और कविता जानता है, तो मैं इसकी सराहना करता हूं। इसके अलावा, अगर कोई एक ही लक्ष्य को पूरा करने का एक और तरीका जानता है (अनावश्यक रूप से वर्बोज़ कोड के बिना, प्रकार के कुछ समूहों के लिए विशेषज्ञता का पुन: उपयोग करना), तो मैं किसी भी सुझाव की भी सराहना करता हूं!
यदि एक ही प्रकार की घोषणा के साथ मल्टीपल बार हैं तो मुझे "संदिग्ध टेम्पलेट विनिर्देश" त्रुटि प्राप्त करने में पूरी तरह से खुशी होगी। कंपाइलर में वास्तव में इसकी सारी जानकारी होती है। उत्सुकता से, एक दोस्त रिपोर्ट करता है कि यह घोषणा मैकोज़ एक्स पर जीसीसी 4.1 पर काम करती है। वैसे भी - उत्तर के लिए धन्यवाद, और सुझाए गए कार्य-आसपास। ऐसा लगता है कि मेरे लिए काम कर सकता है! –