我想不通,爲什麼下面的代碼編譯罰款:C++函數模板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;
}
編輯:特別解釋是受歡迎的,但會更好,如果有人能指出確切的規範。說。謝謝!
編譯器可以從傳遞給foo構造函數的參數(類型B)推斷出第一個示例中的B的類型。在第二個示例中,不能進行這種推理,因爲提供的模板參數是B,構造函數參數也是如此。 A的類型沒有任何證據。 – Stabledog 2012-04-25 20:56:27