मुझे लगता है कि की एक स्पष्ट विशेषज्ञता पर अनुमति नहीं है कि इस त्रुटि के पीछे तर्क यह है कि समारोह टेम्पलेट में डिफ़ॉल्ट तर्क करने के लिए लागू की वजह से है इसकी विशेषज्ञता भी है और आपको C++ में एक से अधिक बार डिफ़ॉल्ट तर्क को परिभाषित करने की अनुमति नहीं है।
#include <iostream>
template<class T> void f(T t = 'a') {}
template<> void f<char>(char c)
{
std::cout << c << std::endl;
}
int main(int argc, char **argv)
{
f<char>();
}
यह जिसका अर्थ है कि विशेषज्ञता डिफ़ॉल्ट तर्क मुख्य टेम्पलेट में परिभाषित के साथ कहा जाता है a
प्रिंट होगा:
निम्नलिखित पर विचार करें।
आप प्रत्येक विशेषज्ञता के लिए एक अलग डिफ़ॉल्ट तर्क की जरूरत है आप दृष्टिकोण वर्णन नीचे का उपयोग कर सकते हैं:
#include <iostream>
template<class T>
struct default_arg
{
static T get() { return T(); }
};
template<class T> void f(T t = default_arg<T>::get()) {}
template<>
struct default_arg<char>
{
static char get() { return 'a'; }
};
template<> void f<char>(char c)
{
std::cout << c << std::endl;
}
int main(int argc, char **argv)
{
f<char>();
}
मामूली टिप्पणी: फ़ंक्शन परिभाषा के बाद आपको अर्धविराम की आवश्यकता नहीं है। – vitaut
वास्तव में सवाल का जवाब नहीं दे रहा है, लेकिन यह विशेषज्ञता के बजाए ओवरलोडिंग का उपयोग करने के लिए क्लीनर/आसान नहीं होगा? विशेषज्ञता बनाम अधिक भार पर एक चर्चा के लिए, हर्ब Sutter से इन लेखों देखें: [C/C++ उपयोगकर्ता जर्नल अनुच्छेद] (http://www.gotw.ca/publications/mill17.htm) और [# 49 GotW] (http://www.gotw.ca/gotw/049.htm)। –
@Luc से +1। यदि आप केवल 'शून्य एफ (char c =' a ') {}' करते हैं तो यह पूरी तरह से संकलित करता है। –