non riesco a capire perché il seguente codice compila bene:C++ instantiaion funzione template con i parametri impliciti
#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;
}
Ma se passo l'ordine di A
e B
come qui di seguito, allora non si compila:
#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: spiegazioni ad hoc sono i benvenuti, ma sarebbe meglio se qualcuno può indicare esattamente ciò che le specifiche. dice. Grazie!
Il compilatore può dedurre il tipo di B nel primo esempio dal parametro passato al costruttore foo (di tipo B). Nel secondo esempio, non è possibile eseguire tale inferenza, poiché il parametro del modello fornito è B, così come il parametro del costruttore. Il tipo di A non è in nessun posto in evidenza. – Stabledog