2015-10-13 17 views
12

एक वर्ग:नेस्टेड वर्ग टेम्पलेट विशेषज्ञता

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    Nested<T> n; 
}; 

और मैं Nested विशेषज्ञ करना चाहते हैं। मैं यहाँ क्या करने की कोशिश की:

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    template <> 
    class Nested<int>{}; // by my logic this should work by I have a compilation error "explicit specialization in non-namespace scope 'class A<C, T>'" 

    Nested<T> n; 
}; 

मेरा अगला प्रयास:

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    Nested<T> n; 
}; 

template<> 
A<>::Nested<int>{}; // What is the correct syntax to do it here? Now I have an error "wrong number of template arguments (0, should be 2)" 
stackoverflow मैं एक समाधान पाया पर

यहाँ:

template<typename C, typename T> 
class A 
{ 
    template <typename U, bool Dummy = true> 
    class Nested{}; // why need of this Dummy?? 

    template <bool Dummy> 
    class Nested<int, Dummy>{}; // why need to provide an argument?? 

    Nested<T> n; 
}; 

यह पूरी तरह से काम करता है, लेकिन मैं कैसे नहीं समझ सकता। एक डमी टेम्पलेट तर्क क्यों प्रदान करें? मैं कच्चे विशेषज्ञताया template<> class Nested<int>{} का उपयोग क्यों नहीं कर सकता?

उत्तर

12

यह वर्ग दायरे में स्पष्ट विशेषज्ञता बनाने के लिए मना किया है:

एक स्पष्ट विशेषज्ञता एक namespace विशेष टेम्पलेट enclosing में घोषित किया जाएगा।

लेकिन यह आंशिक विशेषज्ञता बनाने के लिए मना नहीं कर रहा है:

एक वर्ग टेम्पलेट आंशिक विशेषज्ञता घोषित या किसी नाम स्थान गुंजाइश है, जिसमें इसकी परिभाषा परिभाषित किया जा सकता (14.5.1 और 14.5 में redeclared किया जा सकता है .2)।

इस

template <bool Dummy> 
class Nested<int, Dummy>{}; // why need to provide an argument?? 

आंशिक विशेषज्ञता है और यह वर्ग दायरे में इस तरह के विशेषज्ञता बनाने की अनुमति दी है। आप विशेषीकृत बाहरी वर्ग में, नेस्टेड कक्षा को पूरी तरह से विशेषज्ञ नहीं कर सकते हैं। आप ऐसा कर सकते हैं:

template<> 
template<> 
class A<int, double>::Nested<int> 
{ 
}; 

लेकिन आप ऐसा नहीं कर सकते

template<typename C, typename T> 
template<> 
class A<C, T>::Nested<int> 
{ 
}; 
1

मैं इस काम करने के लिए, बाहरी वर्ग के भीतर विशेष टेम्पलेट वर्ग की सभी सामग्री को परिभाषित करते हुए पाने में कामयाब रहे। तो सभी कार्यों को पूरी तरह से कक्षा परिभाषा के साथ परिभाषित किया जाता है। कोई बाहरी फ़ंक्शन परिभाषा नहीं है, जैसा कि जटिल नहीं लग रहा था। अर्थात।

template <typename T, size_t N> 
class A 
{ 
private: 
    template <size_t M> 
    class B 
    { 
     ... 
    }; 

    template <> 
    class B<2> 
    { 
     ... 
    }; 
    ... etc 
}; 

यह कम से कम MS2015 पर काम करता था। कोड ठीक चल रहा है।

+1

हां, लेकिन यह जीसीसी और क्लैंग पर नहीं चलता है। माइक्रोसॉफ्ट की तरह लूज मानक का पालन नहीं कर रहा है। या शायद एक कंपाइलर स्विच है। – nikitablack

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