Я написал простой шаблон, чтобы найти наименьшее число в списке аргументов.Когда мне нужно указать тип шаблона
template<typename T>
T smallerList(T a, T b) {
std::cout << "a= " << a << " b= " << b << std::endl;
return a < b ? a : b;
}
template<typename T, typename... Rest>
T smallerList(const T& param0, const Rest&... rest) {
T temp = smallerList(rest...);
return param0 < temp ? param0 : temp;
}
int main()
{
// Works, returns "3"
std::cout << "Smaller: " << smallerList(4, 5, 6, 3, 7) << std::endl;
// Sort of works, returns "2". Should be "2.14".
std::cout << "Smaller: " << smallerList(3.14, 43534, 100.2, 3.13, 2.14) << std::endl;
}
По какой-то причине второй вызов функции возвращает 2 вместо 2.14. Почему это происходит?
Я напечатал промежуточные значения переменных, и они верны. Кажется, что неявное преобразование происходит, когда smallList возвращается.
я был в состоянии решить эту проблему, изменив строку
T temp = smallerList(rest...);
в
T temp = smallerList<T>(rest...);
После этого изменения функция печатает 2.14, как и ожидалось.
Мой вопрос: Почему мне нужно указать тип? Я думал, что функции шаблонов «созданы» для каждого вызываемого типа?
Хорошо, какой должен быть тип возврата 'smallList (3.14, 43534, 100.2, 3.13, 2.14)' и почему? Можете ли вы придумать критерий? – luk32