2015-04-09 6 views
5

मैं किसी अन्य वर्ग के अंदर एक टेम्पलेट वर्ग का विशेषज्ञ बनने की कोशिश कर रहा हूं लेकिन संकलक मुझे नहीं जाने देगा। कोड कक्षा फू के बाहर काम करता है लेकिन अंदर नहीं है और मैं चाहता हूं कि संरचना Bla कक्षा Foo के लिए निजी हो।टेम्पलेट उप-वर्ग का विशेषज्ञ कैसे करें?

class Foo { 
    template<typename ... Ts> struct Bla; 
    template<> struct Bla<> { static constexpr int x = 1; }; 
}; 

error: explicit specialization in non-namespace scope 'class Foo' 

उत्तर

3

आप वर्ग, उपयोग के अंदर विशेषज्ञ नहीं कर सकते हैं:

class Foo { 
public: // so we can test it easily 
    template<typename ... Ts> struct Bla; 
}; 

// specialize it outside the class 
template<> class Foo::Bla<> { static constexpr int x = 1; }; 

int main() 
{ 
    std::cout << Foo::Bla<>::x; 
} 
+0

धन्यवाद, यह बिल्कुल समाधान है। –

+0

@ गोस्विनवोनब्रेडरलो नोट करें कि मैंने यहां 'सार्वजनिक' का उपयोग किया है, इसलिए मैं 'Bla :: x' प्रदर्शित कर सकता हूं। हालांकि मुझे लगता है कि आप एक 'मित्र' का उपयोग कर रहे हैं या किसी सदस्य फ़ंक्शन के माध्यम से प्रदर्शित कर रहे हैं, इस मामले में आपको ठीक होना चाहिए। – vsoftco

+0

यह मुझे हालांकि सोचता है। क्या वह कक्षा की गोपनीयता का उल्लंघन करने की अनुमति नहीं देता है? 'कक्षा फू {स्थिर constexpr int y = 1; सार्वजनिक: टेम्पलेट संरचना Bla; }; टेम्पलेट <> संरचना Foo :: Bla <> {स्थिर constexpr int x = y; }; 'Foo :: y निजी है लेकिन Bla का विशेषज्ञता करके Foo के किसी भी उपयोगकर्ता को Bla :: x के माध्यम से इसका उपयोग प्राप्त हो सकता है। –

4

आप बस ऐसा नहीं कर सकते हैं। त्रुटि इसे अच्छी तरह से बताती है। कक्षा टेम्पलेट्स केवल नामस्थान क्षेत्र में विशिष्ट हो सकते हैं। class Foo नामस्थान नहीं है।

आप मानक [temp.class.spec] से यह वर्ग के लिए बाहरी क्या कर सकते हैं इस उदाहरण के अनुसार,:

एक वर्ग टेम्पलेट आंशिक विशेषज्ञता घोषित या किसी नाम स्थान दायरे में redeclared किया जा सकता है, जिसमें इसकी परिभाषा परिभाषित की जा सकती है (14.5.1 और 14.5.2)। [उदाहरण:

template<class T> struct A { 
    struct C { 
     template<class T2> struct B { }; 
    }; 
}; 

// partial specialization of A<T>::C::B<T2> 
template<class T> template<class T2> 
    struct A<T>::C::B<T2*> { }; 

A<short>::C::B<int*> absip; // uses partial specialization 

अंत उदाहरण]

+0

मानक के भावों का upvoted, तुम सच में तेजी से कर रहे हैं :) – vsoftco

+0

@vsoftco बस अध्याय टेम्पलेट्स पर शुरू करें और "स्कोप" के लिए खोज रखें :) – Barry

+1

हाँ मुझे पता है कि यह कैसे काम करता है, लेकिन फिर भी, मैं बहुत आलसी था :) – vsoftco

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

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