2015-06-24 4 views
7

इन परिभाषाओं को देखते हुएआप एक निजी सदस्य के प्रकार पर एक टेम्पलेट का विशेषज्ञ कब कर सकते हैं?

template<class T> class foo {}; 
template<class T> class foo1 { static int i; }; 
class bar { class baz {}; }; 

मैं देखना है कि इस संकलित

template<> 
class foo<bar::baz> {}; 

हैरान हूँ लेकिन इस त्रुटि 'class bar::baz' is private

template<> 
int foo1<bar::baz>::i = 42; 

जब ऐसा होता है के साथ विफल रहता है, और वहाँ है सार्वजनिक प्रकार बनाने के अलावा एक कामकाज?

+0

वह * दिलचस्प है। मुझे लगता है कि यह इस वर्ग के चर को परिभाषित करने में त्रुटि है। आईई, 'foo {};' ठीक है (g ++), लेकिन फिर 'foo f; 'नहीं है। तो यह बहुत अधिक उपयोग करने योग्य प्रकार है, और ऐसा लगता है कि त्रुटि अपेक्षाकृत देर से आती है (यानी, कक्षा परिभाषा पर नहीं)। –

+0

@AmiTavory यह अनुपयोगी नहीं है, क्योंकि आप हमेशा एक [सार्वजनिक प्रकार उपनाम] जोड़ सकते हैं (http://coliru.stacked-crooked.com/a/22807544d8414c4e)। दिलचस्प सवाल, यद्यपि। ':: i' के लिए विशेषज्ञता पर एक एक्सेस चेक क्यों है? –

+0

@DanielFrey मेरी समझ यह है कि प्रश्न 'बार' के कोड को संशोधित किए बिना मामले के बारे में है। –

उत्तर

5

पर विचार करें CWG #182:

कुछ पहुँच चेकों स्पष्ट instantiations पर दबा दिया जाता है। 14.7.2 [temp.explicit] अनुच्छेद 8 कहता है [...] मुझे आश्चर्य हुआ कि स्पष्ट विशेषज्ञता के लिए समान शब्द मौजूद नहीं है (जो मुझे मिल सकता है)। मेरा मानना ​​है कि दो मामलों को को नीचे दिए गए उदाहरण में समान रूप से संभाला जाना चाहिए (यानी, विशेषज्ञता की अनुमति दी जानी चाहिए)।

template <class T> struct C { 
    void f(); 
    void g(); 
}; 

template <class T> void C<T>::f(){} 
template <class T> void C<T>::g(){} 

class A { 
    class B {}; 
    void f(); 
}; 

template void C<A::B>::f(); // okay 
template <> void C<A::B>::g(); // error - A::B inaccessible 

[...]

दलील (अक्टूबर 2002):

हम इस पर फिर से विचार और निर्णय लिया कि दो मामलों में (स्पष्ट विशेषज्ञता और स्पष्ट इन्स्टेन्शियशन) के बीच का अंतर उचित है । जब संभव हो तो पर कुछ स्पष्ट नामांकन की अनुमति देने के लिए एक्सेस नियमों को झुकाया जाता है, लेकिन स्पष्ट विशेषज्ञता के लिए न केवल इकाई का नामकरण करने की आवश्यकता होती है बल्कि को कहीं परिभाषा भी प्रदान की जाती है।

:, असंगत व्यवहार एक वर्ग टेम्पलेट की एक इसी स्पष्ट विशेषज्ञता के लिए के रूप में, वे एक त्रुटि संदेश जारी नहीं करते - जाहिरा तौर पर -

जीसीसी और बजना वास्तव में दिखाया उदाहरण की अंतिम पंक्ति है, जो अस्वीकार करते

template <class> struct T { 
    void g(); 
}; 

class A { class B; class C; }; 

template <> struct T<A::B>; // Ok 
template <> void T<A::C>::g(); // Error 

Demo। बिंदु पर एक टेम्पलेट तर्क के नाम सुलभ हो जाएगा

कि वह कहाँ है: तो मैं यहाँ एक अंग पर बाहर जाना और दोनों ही मामलों आप बीमार का गठन दिखाया फोन द्वारा §14.3/3 करेंगे टेम्पलेट-तर्क के रूप में उपयोग किया जाता है।

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

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