मैं gcc 4.6.1 का उपयोग करके विविध टेम्पलेट पैरामीटर के साथ खेल रहा था।टेम्पलेट में फ़ंक्शन प्रकार संकलित नहीं करता है
template<typename RetType, typename... ArgTypes>
class Event;
template<typename RetType, typename... ArgTypes>
class Event<RetType(ArgTypes...)>
{
public:
typedef function<RetType(ArgTypes...)> CallbackType;
void emit(ArgTypes...args)
{
for (CallbackType callback : callbacks)
{
callback(args...);
}
}
private:
vector<CallbackType> callbacks;
};
लेकिन मेरे आश्चर्य निम्नलिखित "सामान्य" संस्करण है कि केवल एक "तर्क प्रकार" पर संकलन नहीं करता है:: निम्नलिखित कोड अपेक्षित ढंग से संकलित
template<typename RetType, typename ArgType>
class Event;
template<typename RetType, typename ArgType>
class Event<RetType(ArgType)> // <- error: wrong number of template arguments (1, should be 2)
{};
जी ++ 4.6.1 त्रुटि देता है टिप्पणी में के रूप में।
कोई भी जानता है कि यह त्रुटि क्यों उत्पन्न करता है और इसे कैसे काम करता है? साथ ही, क्या मैं उपरोक्त कोड को सोचने में सही हूं "टेम्पलेट आंशिक विशेषज्ञता" का एक रूप है?
ऐसा लगता है कि संकलक रीटटाइप (ArgType) को फ़ंक्शन प्रकार की घोषणा के बजाए एक तर्क के रूप में सोचता है जो मेरा मतलब था। आश्चर्य की बात क्यों है कि यह वैचारिक घोषणा के समान ही इसका इलाज नहीं कर सकता है। और नहीं, यह रिकर्सन नहीं है। यहां विविधता तर्कों का उपयोग करने का मेरा इरादा फ़ंक्शन प्रकार की घोषणा को आगे बढ़ाने और फ़ंक्शन ऑब्जेक्ट्स का उपयोग करना है। –
कोस: यह नहीं है। उस टिप्पणी को हटा दिया। – ronag
एच Xu: मुझे नहीं लगता कि वैरिएड संस्करण काम करता है जैसा आप उम्मीद करते हैं। मुझे लगता है कि ArgTypes ... हमेशा जिस तरह से आप इसका उपयोग कर रहे हैं खाली हो जाएगा। – ronag