मैं टेम्पलेट कार्यों के बारे में पढ़ रहा था और इस समस्या से उलझन में था:
#include <iostream>
void f(int) {
std::cout << "f(int)\n";
}
template<typename T>
void g(T val) {
std::cout << typeid(val).name() << " ";
f(val);
}
void f(double) {
std::cout << "f(double)\n";
}
template void g<double>(double);
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // d f(int), this is surprising
g(1); // i f(int)
}
यदि मैं नहीं लिखता तो परिणाम वही हैं template void g<double>(double);
।
मुझे लगता है कि के g<double>
बाद तुरंत किया जाना चाहिए f(double)
, और इसलिए कॉल f
में g
कॉल करना चाहिए f(double)
। हैरानी की बात है, यह अभी भी अंदर बुलाता f(int)
है g<double>
। क्या कोई मुझे यह समझने में मदद कर सकता है?
जवाब पढ़ने के बाद, मुझे पता चला कि वास्तव में मेरा भ्रम क्या है।
यहाँ एक अद्यतन उदाहरण है। यह ज्यादातर अपरिवर्तित है सिवाय इसके कि मैंने इसके लिए एक विशेषज्ञता जोड़ी g<double>
:
#include <iostream>
void f(int){cout << "f(int)" << endl;}
template<typename T>
void g(T val)
{
cout << typeid(val).name() << " ";
f(val);
}
void f(double){cout << "f(double)" << endl;}
//Now use user specialization to replace
//template void g<double>(double);
template<>
void g<double>(double val)
{
cout << typeid(val).name() << " ";
f(val);
}
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // now d f(double)
g(1); // i f(int)
}
उपयोगकर्ता विशेषज्ञता के साथ, g(1.0)
जैसा मैं अपेक्षित था , वैसा ही व्यवहार करता है।
कंपाइलर को स्वचालित रूप g<double>
से एक ही स्थान पर (या इसके बाद भी main()
, जैसा कि C ++ प्रोग्रामिंग लैंग्वेज , 4 वें संस्करण की धारा 26.3.3 में वर्णित है) के लिए यह तुरंत नहीं करना चाहिए ?
g(1)
देताi f(int)
है। आपने लिखाd f(double)
। क्या यह एक टाइपो था?