Tôi không thể hiểu tại sao đoạn mã sau biên dịch tốt:C++ Chức năng Template instantiaion với các thông số ngầm
#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;
}
Nhưng nếu tôi chuyển đổi thứ tự của A
và B
như dưới đây, sau đó nó sẽ không biên dịch:
#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: Giải thích đặc biệt được hoan nghênh, nhưng sẽ tốt hơn nếu ai đó có thể chỉ ra chính xác thông số. nói. Cảm ơn!
Trình biên dịch có thể suy ra loại B trong ví dụ đầu tiên của bạn từ tham số được truyền cho hàm tạo foo (thuộc loại B). Trong ví dụ thứ hai, không có suy luận như vậy có thể được thực hiện, bởi vì tham số mẫu được cung cấp là B, và do đó là tham số hàm tạo. Loại A không có trong chứng cứ. – Stabledog