nie mogę dowiedzieć się, dlaczego następujący kod kompiluje grzywny:C++ Template Funkcja instantiaion parametrów ukrytych
#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;
}
Ale jeśli mogę przełączyć kolejność A
i B
jak poniżej, to nie będzie skompilować:
#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: Ad-hoc wyjaśnienia są mile widziane, ale byłoby lepiej, jeśli ktoś może wskazać dokładny co spec. mówi. Dzięki!
Kompilator może wywnioskować typ B w pierwszym przykładzie z parametru przekazanego do konstruktora foo (typu B). W drugim przykładzie nie można dokonać takiego wnioskowania, ponieważ podany parametr szablonu to B, a zatem jest to parametr konstruktora. Rodzaj A nie jest widoczny. – Stabledog