2016-03-09 8 views
7

यह मान्य सी ++ क्यों नहीं है?मैं टेम्पलेट कंटेनर और टेम्पलेट दोनों के साथ एक प्रकार की घोषणा क्यों नहीं कर सकता?

template <typename Container, typename T> 
bool 
foo (const Container <T> &); 

जी ++ मुझे Container is not a template देता है जो स्पष्ट रूप से नहीं है क्या यह वास्तव में मतलब है।

template <typename Container> template <typename T> कोशिश कर रहा है या तो काम नहीं करता है, न तो const typename Container <T> &

यह है कि एक एक इंटरफेस है जो दोनों कंटेनर और निहित प्रकार से अधिक सामान्य है परिभाषित करना चाहते हैं मेरे लिए उचित लगता है।

तो,

    मानकों के मामले में
  • , क्यों यह अनुमति नहीं है?
  • डिजाइनिंग मानकों के मामले में, इसकी अनुमति क्यों नहीं दी जाएगी, क्या इससे समस्याएं पैदा होंगी?
  • क्या सी ++ 14 में एक वर्कअराउंड है, इसके अलावा इटरेटर पर इंटरफेस को आधार देने के अलावा?
+0

आप कंटेनर का उपयोग क्यों नहीं कर सकते और टी से छुटकारा पा सकते हैं? –

+1

यह क्यों काम करना चाहिए? आप 'std :: vector' को पास नहीं कर सकते हैं, आपको 'std :: vector ' पास करना होगा। यदि आप ऐसा करते हैं तो आप कंपाइलर को 'std :: vector ' करने के लिए कह रहे हैं जो बकवास है। – NathanOliver

+0

बात यह है कि आप अपने कंपाइलर को बता रहे हैं कि आपके 2 सामान्य पैरामीटर प्रकार हैं हालांकि कंटेनर एक प्रकार का नहीं है जब तक कि इसे अपना सामान्य पैरामीटर नहीं दिया जाता है। – Loomchild

उत्तर

7

आप ऐसा कर सकते हैं:

template <template <class... > class Container, class T> 
bool foo (const Container<T> &); 

इस वाक्य रचना (class...) संकलक कि container तर्क के किसी भी संख्या के साथ एक टेम्पलेट है बताता है।

याद रखें, जब आपके पास template <class T> है, तो आप टी को टाइप करना चाहते हैं। std::vector एक प्रकार नहीं है, यह एक टेम्पलेट है। std::vector<int> एक प्रकार है, लेकिन यह एक टेम्पलेट नहीं है, इसलिए आपके पास std::vector<int> <char> नहीं हो सकता है।

+2

आप 'टेम्पलेट कक्षा कंटेनर' का उपयोग कर सकते हैं, जो 'std :: vector' के लिए काम करेगा। – TartanLlama

+0

@ टार्टनलामा, हां, निश्चित रूप से। संपादित। – SergeyA

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