Учитывая следующие шаблоны функций:Почему компилятор не выбирает мою функцию-перегрузку шаблона в следующем примере?
#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)
{
};
Почему следующий код всегда вызывает перегрузку # 1 вместо перегрузки # 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;
}
Учитывая, что второй параметр f
является производным типом Base
, я надеялся, что компилятор будет выбирать перегрузки # 2, как это лучше, чем матч общего типа в перегрузки # 1.
Есть ли какие-либо методы, которые я мог бы использовать для перезаписи этих функций, чтобы пользователь мог писать код, отображаемый в функции main
(т. Е. Используя компилятор-вывод типов аргументов)?
Хотя это не связано с основным вопросом, все еще: 1. «int main()», пожалуйста. 2. За определением функции шаблона следуют пустые объявления ';'. Это незаконно в C++. – AnT