Проблема в создании шаблона для функции
Необходимо создать явную специализацию шаблона для функции, которая принимает два аргумента элемента структуры и возвращает значение большего элемента. Элемент имеет тип float. В данной программе также есть шаблон функции, который принимает два числа любого типа(встроенного) и возвращает большее из них. Я написал код, но при попытке создания шаблона для структуры возникает непонятная мне ошибка - "no instance of function template matches the specified type". Цель моего вопроса понять, почему это не работает, а не решить иным способом.
#include <iostream>
struct box
{
char maker[40];
float height;
float width;
float length;
float volume;
};
template <typename Any>
Any grand_number(Any n, Any b);
template <>
float grand_number (box n, box b);
int main()
{
box one = { "Dmitry", 10, 10, 10,1000 };
box two = { "Dmitry", 10, 10, 10,1222 };
std::cout << grand_number(2, 69);
std::cout << grand_number(one,two);
return 0;
}
template <typename Any> Any grand_number(Any n, Any b)
{
return (n < b) ? b : n;
}
template <>
box grand_number<box>(box n, box b)
{
return (n.volume < b.volume) ? b.volume : n.volume;
}
Ответы (1 шт):
Ну, у вас все же шаблон возвращает тот же тип, что и передается (передаем Any
, возвращаем Any
). Вы же хотите передать один тип - box
, а вернуть другой - float
(причем один раз у вас написано float
, второй - box
. Тщательне'е надо быть :))
Вот так заработает:
template <typename Any>
Any grand_number(Any n, Any b);
template <>
box grand_number(box n, box b);
....
template <typename Any> Any grand_number(Any n, Any b)
{
return (n < b) ? b : n;
}
template <>
box grand_number<box>(box n, box b)
{
return (n.volume < b.volume) ? b : n;
}
Правда, это не то, что вам хочется...
И, хотя вы и слышать не хотите, как обойти, я все же напишу: перегрузка вас спасет.
template <typename Any>
Any grand_number(Any n, Any b);
float grand_number(box n, box b);
....
template <typename Any> Any grand_number(Any n, Any b)
{
return (n < b) ? b : n;
}
float grand_number(box n, box b)
{
return (n.volume < b.volume) ? b.volume : n.volume;
}
Update
Вот как можно решить вашу проблему (и почему сразу не дошло? редко я шаблонами пользуюсь...)
template <typename Any>
auto grand_number(Any n, Any b)
{
return (n < b) ? b : n;
}
template <>
auto grand_number (box n, box b)
{
return (n.volume < b.volume) ? b.volume : n.volume;
}