No puedo entender por qué el siguiente código compila bien:C++ instantiaion plantilla de función con los parámetros implícitos
#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;
}
Pero si cambio el orden de A
y B
como abajo, entonces no va a compilar:
#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;
}
EDIT: explicaciones ad-hoc son bienvenidos, pero sería mejor si alguien puede señalar exactamente lo que la especificación. dice. ¡Gracias!
El compilador puede inferir el tipo de B en su primer ejemplo del parámetro pasado al constructor foo (de tipo B). En el segundo ejemplo, no se puede hacer tal inferencia, porque el parámetro de plantilla proporcionado es B, y también lo es el parámetro constructor. El tipo de A no está en evidencia. – Stabledog