Форум программистов, компьютерный форум CyberForum.ru

Перегрузка шаблонных функций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
06.08.2012, 21:10     Перегрузка шаблонных функций #1
Есть сруктура box и два шаблоны для поиска максимального числа. Один для встроенных типов а второй для структуры. Если в функцию передается структура box то она должна возвращать максимальный объем.
Никак не могу правильно сделать вторую шаблонную функцию. Я в комментарии ошибку показал. Подскажите как правильно сделать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct box
{
    char maker[40];
    float height;
    float width;
    float length;
    float volume;
};
 
template <typename T>
T my_max(T a, T b)
{
    return a > b ? a : b;
}
 
template <>
float my_max(const box &b1, const box &b2)  // error: template-id 'my_max<>' for 'float my_max(const box&, const box&)' does not match any template declaration|
{
    return b1.volume > b2.volume ? b1.volume : b2.volume;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2012, 21:10     Перегрузка шаблонных функций
Посмотрите здесь:

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов C++
C++ Использрвание шаблонных функций( на C++
C++ Перегрузка функций. Реализация функций
Программа не компилируется при перестановке прототипов шаблонных функций C++
Использование шаблонных функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.08.2012, 21:21     Перегрузка шаблонных функций #2
Intel~lect, никак. Крайне глупо передавать в функцию по нахождению максимального элемента переменную одного типа, а возращать совсем другой.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
06.08.2012, 21:28     Перегрузка шаблонных функций #3
Тип возвращаемого значения и тип аргументов в шаблоне один и тот же, а в специализации разный. Если уж делать так, то:
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename T1, typename T2>
T1 my_max(T2 a, T2 b)
{
    return a > b ? a : b;
}
 
template <>
float my_max(const box &b1, const box &b2) 
{
    return b1.volume > b2.volume ? b1.volume : b2.volume;
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.08.2012, 21:32     Перегрузка шаблонных функций #4
John Prick, и каждый раз при вызове явно указывать возвращаемый параметр.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
06.08.2012, 21:39  [ТС]     Перегрузка шаблонных функций #5
John Prick, А так почему то ошибки появляются когда вызываю функцию
C++
1
2
3
4
    box b1 = {"BOX1", 10, 10, 10, 1000};
    box b2 = {"BOX2", 20, 20, 20, 8000};
 
    cout << float(my_max<box>(b1, b2)) << endl; //error: no matching function for call to 'my_max(box&, box&)'|
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
06.08.2012, 21:43     Перегрузка шаблонных функций #6
Да, это я неправильно сказал. Компилятор не может разобраться, какую функцию вызывать, шаблонную или специализированную.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.08.2012, 21:58     Перегрузка шаблонных функций #7
в приведенном примере лучше оформить отдельную свободную функцию. это и будет перегрузка, а не попытка специализировать шаблоную функцию.
т.е.
C++
1
2
3
4
float my_max(const box &b1, const box &b2) 
{
    return b1.volume > b2.volume ? b1.volume : b2.volume;
}
но это как-то криво. она не определяет максимальный из объектов по закодированному критерию, а еще и возаращает значение из волюма. Тогла лучше ее и называть соответственно, чтобы не было непоняток:
C++
1
2
3
4
float GetMaxVolume(const box& one, const box& other)
{
  return max(one.volume, other.volume); // ну или еще как-то реализовать. реализация не особо важна
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
06.08.2012, 22:00     Перегрузка шаблонных функций #8
Можно из перегруженной нешаблонной вызвать шаблонную:
C++
1
2
3
4
float my_max(const box &b1, const box &b2)
{
    return my_max(b1.volume, b2.volume);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2012, 22:18     Перегрузка шаблонных функций
Еще ссылки по теме:

C++ Перегрузка функций
C++ Отделить описание шаблонных функций и классов от реализации
Переделать код с помощью шаблонных функций C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
06.08.2012, 22:18  [ТС]     Перегрузка шаблонных функций #9
Спасибо что помогли. С отдельными функциями все работает без ошибок
Yandex
Объявления
06.08.2012, 22:18     Перегрузка шаблонных функций
Ответ Создать тему
Опции темы

Текущее время: 02:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru