Với chức năng mẫu sau:Tại sao trình biên dịch không chọn quá tải hàm mẫu của tôi trong ví dụ sau?
#include <vector>
#include <utility>
struct Base { };
struct Derived : Base { };
// #1
template <typename T1, typename T2>
void f(const T1& a, const T2& b)
{
};
// #2
template <typename T1, typename T2>
void f(const std::vector<std::pair<T1, T2> >& v, Base* p)
{
};
Tại sao nó rằng đoạn mã sau luôn gọi quá tải # 1 thay vì tình trạng quá tải # 2?
int main()
{
std::vector<std::pair<int, int> > v;
Derived derived;
f(100, 200); // clearly calls overload #1
f(v, &derived); // always calls overload #1
return 0;
}
Cho rằng tham số thứ hai của f
là một loại có nguồn gốc của Base
, tôi đã hy vọng rằng trình biên dịch sẽ chọn quá tải # 2 vì nó là một trận đấu tốt hơn so với loại chung trong tình trạng quá tải # 1.
Có bất kỳ kỹ thuật nào mà tôi có thể sử dụng để viết lại các chức năng này để người dùng có thể viết mã như được hiển thị trong chức năng main
(tức là, tận dụng trình biên dịch-khấu trừ các loại đối số) không?
Mặc dù nó không liên quan đến câu hỏi chính, vẫn: 1. 'int main()', vui lòng. 2. Định nghĩa hàm mẫu của bạn được theo sau bởi các khai báo trống ';'. Điều này là bất hợp pháp trong C++. – AnT