मैं समझ नहीं क्यों निम्नलिखित कोड ठीक संकलित:सी ++ निहित मापदंडों के साथ समारोह खाका instantiaion
#include <iostream>
void bar(int x) {
std::cout << "int " << x << std::endl;
}
void bar(double x) {
std::cout << "double " << x << std::endl;
}
template <typename A, typename B> // Note the order of A and B.
void foo(B x) {
bar((A)x);
}
int main() {
int x = 1;
double y = 2;
foo<int>(x); // Compiles OK.
foo<double>(y); // Compiles OK.
return 0;
}
लेकिन अगर मैं A
और नीचे के रूप में B
का क्रम बदलने, तो यह संकलन नहीं होगा:
#include <iostream>
void bar(int x) {
std::cout << "int " << x << std::endl;
}
void bar(double x) {
std::cout << "double " << x << std::endl;
}
template <typename B, typename A> // Order of A and B are switched.
void foo(B x) {
bar((A)x);
}
int main() {
int x = 1;
double y = 2;
foo<int>(x); // error: no matching function for call to ‘foo(int&)’
foo<double>(y); // error: no matching function for call to ‘foo(double&)’
return 0;
}
संपादित करें: तदर्थ स्पष्टीकरण स्वागत है, लेकिन बेहतर होगा अगर किसी को सही क्या कल्पना का कहना है सकते हैं। कहते हैं। धन्यवाद!
कंपाइलर आपके पहले उदाहरण में बी के प्रकार को फू कन्स्ट्रक्टर (प्रकार बी) में पारित पैरामीटर से अनुमान लगा सकता है। दूसरे उदाहरण में, ऐसी कोई अनुमान नहीं बनाई जा सकती है, क्योंकि आपूर्ति किए गए टेम्पलेट पैरामीटर बी है, और यह कन्स्ट्रक्टर पैरामीटर भी है। ए के प्रकार सबूत में कहीं भी नहीं है। – Stabledog