Проблема в создании шаблона для функции

Необходимо создать явную специализацию шаблона для функции, которая принимает два аргумента элемента структуры и возвращает значение большего элемента. Элемент имеет тип 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 шт):

Автор решения: Harry

Ну, у вас все же шаблон возвращает тот же тип, что и передается (передаем 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;
}
→ Ссылка