2013-02-08 14 views
5

के साथ एक आंतरिक वर्ग सदस्य फ़ंक्शन टेम्पलेट को परिभाषित करना मुझे एक गैर-प्रकार (enum) तर्क पर टेम्पलेट किया गया है जो एक आंतरिक वर्ग Outer<T1>::Inner के सदस्य फ़ंक्शन update() को परिभाषित करने और विशेषज्ञता करने में कठिनाई हो रही है।एक (गैर प्रकार) enum तर्क

#include <cstdlib> 

template<typename T1> 
struct Outer 
{ 
    struct Inner 
    { 
     enum Type{ A , B , C }; 

     template<Type T2> 
     void update(); 
    }; 
}; 

// Definition 
template<typename T1> 
template<Outer<T1>::Inner::Type T2> 
void Outer<T1>::Inner::update() 
{ 
} 

// Specialization 
template<typename T1> 
template<Outer<T1>::Inner::A > 
void Outer<T1>::Inner::update() 
{ 
} 

int main() 
{ 
    return EXIT_SUCCESS; 
} 

मैं जीसीसी में निम्न त्रुटि संदेश मिल रहा है 4.5.3

prog.cpp:17:28: error: ‘Outer::Inner::Type’ is not a type 
prog.cpp:18:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’ 
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update() 
prog.cpp:24:28: error: ‘Outer::Inner::A’ is not a type 
prog.cpp:25:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’ 
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update() 

Btw, जीसीसी के विपरीत, विजुअल स्टूडियो 2008 निम्नलिखित संकलन करने में असमर्थ है

template<typename T1> 
struct Outer 
{ 
    struct Inner 
    { 
     enum Type{ A , B , C }; 

     template<Type T2> 
     struct Deep; 
    }; 
}; 

template<typename T1> 
template<typename Outer<T1>::Inner::Type T2> 
struct Outer<T1>::Inner::Deep 
{ 
}; 
+0

मुझे कुछ समय में देखा गया वीसी2012 से अधिक विनोदी त्रुटि संदेशों में से एक को स्वीकार करना है: 'त्रुटि C2244:' बाहरी :: इनर :: अपडेट ': मौजूदा घोषणा के लिए फ़ंक्शन परिभाषा से मिलान करने में असमर्थ, परिभाषा 'शून्य बाहरी :: इनर :: अपडेट (शून्य)', मौजूदा घोषणाएं: 'शून्य बाहरी :: इनर :: अपडेट (शून्य) "मौजूदा और वांछित घोषणाओं के बीच हड़ताली अंतर इतना स्पष्ट है, है यह = पी – WhozCraig

+1

मैं टिप्पणी करने वाला था कि विजुअल स्टूडियो 2008 स्वीकृति नहीं देता है। क्या आसपास कोई काम है? मैं वास्तव में वीएस में कोडिंग कर रहा हूँ। मैं स्वच्छता अनुपालन जांच के लिए जीसीसी का उपयोग करता हूं। – Olumide

+0

@ ओलुमाइड आप जो कर रहे हैं उसके लिए एक रनटाइम चेक पर्याप्त होगा? संकलक सबसे अधिक संभावना चेक और मृत कोड को अनुकूलित करेगा क्योंकि यह जानता है कि यह हमेशा सत्य या गलत होगा। –

उत्तर

4

सबसे पहले, आप Outer<T1>::Inner::Type से पहले typename खो रहे हैं। आपको template टाइप सूची में भी यह होना चाहिए, क्योंकि Type एक निर्भर प्रकार है।

दूसरा, आपका विशेषज्ञता वाक्यविन्यास गलत है (प्रकार <> में template<> में नहीं, ब्रांड्स से पहले फ़ंक्शन नाम के बाद जाता है), लेकिन यदि यह सही था, तो यह कानूनी नहीं होगा। स्पष्ट टेम्पलेट विशेषज्ञता के बारे में एक दुर्भाग्यपूर्ण नियम के मुताबिक, update को पूरी तरह से विशेषज्ञता देने से पहले आपको बाहरी टेम्पलेट Outer विशेषज्ञ करना होगा।

+0

दोह! ... (धन्यवाद।) – Olumide

+2

अनजान के लाभ के लिए: इस मामले में "बाहरी टेम्पलेट का विशेषज्ञता" क्या होगा? – us2012

+1

@ us2012 यह सिर्फ 'टेम्पलेट <> टेम्पलेट <> शून्य बाहरी :: इनर :: अपडेट :: इनर :: ए>() 'या जो भी हो। मुद्दा यह है कि 'बाहरी' को भी विशेष होना चाहिए। –

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