2013-06-07 9 views
6

आधे घंटे पहले मैंने विविध टेम्पलेट पैरामीटर खोजे और अब मैं पूरी तरह से झुका हुआ हूं।सी ++ वैराडिक टेम्पलेट क्लास समाप्ति

मेरे पास माइक्रोकंट्रोलर आउटपुट पिन के लिए एक स्थिर श्रेणी आधारित अमूर्तता है। मैं कई आउटपुट पिन समूहबद्ध करना चाहता हूं ताकि मैं उन्हें एक पिन के रूप में संभाल सकूं। नीचे दिए गए कोड काम करता है, लेकिन मुझे लगता है मैं 0 मानकों के आधार पर की बजाय 1.

template< typename pin, typename... tail_args > 
class tee { 
public: 

    typedef tee<tail_args...> tail; 

    static void set(bool b){ 
     pin::set(b); 
     tail::set(b); 
    } 

}; 

template< typename pin > 
class tee<pin> { 
public: 

    static void set(bool b){ 
     pin::set(b); 
    } 

}; 

पर मैं इस कोशिश की प्रत्यावर्तन समाप्त करने के लिए सक्षम होना चाहिए लेकिन संकलक (जीसीसी) यह ध्यान में रखना नहीं लगता है:

template<> 
class tee<> : public pin_output { 
public: 

    static void set(bool b){} 

}; 

त्रुटि संदेश लंबा है, लेकिन यह अनिवार्य रूप से कहता है कि कोई टी <> नहीं है। वहाँ कुछ मेरी टी < साथ कुछ गड़बड़ है> या नहीं यह प्रत्यावर्तन समाप्त करने के लिए संभव है

+0

आप जीसीसी के क्या संस्करण का उपयोग कर रहे हैं? क्या यह जीसीसी 4.8 है और क्या आपने '-std = C++ 11' ध्वज पास किया है ('-Wall' के साथ भी)? –

+0

आपका प्रकार 'टेम्पलेट <टाइपनाम ...> कक्षा टी 'होना चाहिए, और आपका समाप्ति मामला' टेम्पलेट <> कक्षा टी <> {}; 'होना चाहिए। –

+0

@ बेसिल: 4.7.2; मैंने -std = C++ 0x का उपयोग किया; -std = C++ 11 -Wall का उपयोग नहीं करता है; –

उत्तर

6

आपका सबसे सामान्य स्थिति में कम से कम 1 तर्क (pin) लगता है, इसलिए एक विशेषज्ञता, 0 तर्क है कि नहीं बना सकते।

इसके बजाय, आप सबसे सामान्य स्थिति बनाना चाहिए, कि स्वीकार करता तर्कों में से किसी राशि:

template<typename...> class tee; 

और फिर विशेषज्ञताओं बनाएँ:

template< typename pin, typename... tail_args > 
class tee<pin, tail_args...> { 
public: 

    typedef tee<tail_args...> tail; 

    static void set(bool b){ 
     pin::set(b); 
     tail::set(b); 
    } 

}; 

template<> 
class tee<> { 
public: 

    static void set(bool b){} 

}; 
+0

शानदार, एक आकर्षण की तरह काम करता है, और मैं अपने रास्ते पर एक छोटा कदम हूँ :) –

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