Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788

Специализация шаблонов функций

08.03.2022, 01:14. Показов 711. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Изучаю шаблоны функций (не классов). Вот фрагмент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <typename T>
T max_elem(const T *arr, int c) {
    T max = arr[0];
    for (int i = 1;i<c;i++)
        if (arr[i] > max) max = arr[i];
    return max;
}
 
template <> double max_elem(const double *arr, int c) {
    double max = arr[0];
    for (int i = 1;i<c;i++)
        if (arr[i] > max) max = arr[i];
    return -max;
}
 
template <> char * max_elem(const char **arr, int c) {
//  cout << arr[0] << endl;
//  cout << arr[1] << endl;
//  return NULL;
}
Создается шаблон. Далее (для проверки работы синтаксиса специализации) сделана специализация для типа данных double - вызывается, нормально работает.
А вот специализация для char * (последний вариант) не компилируется.
gcc, командная строка: g++ -std=c++11 ch22m.cpp
Ошибка: error: template-id 'max_elem<>' for 'char* max_elem(const char**, int)' does not match any template declaration.

Что я в случае с char* делаю не так?

Вызов функций шаблонов:
C++
1
2
3
4
5
6
7
    int vi[6] = {-55,33,0,81,22,11};
    double vd[4] = {33,14.4,-3.8,0};
    const char *vs[5] = {"line one","line two","line three","line four","line five"};
    
    cout << "int: " << max_elem(vi,6) << endl;
    cout << "double: " << max_elem(vd,4) << endl;
    cout << "char: " << max_elem(vs,5) << endl;
Если специализацию для char * убрать, все компилируется и для char * используется общая форма - возвращается указатель на последнюю строку (которая ожидаемо находится в памяти "правее" предыдущих).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2022, 01:14
Ответы с готовыми решениями:

Явная специализация шаблонов функций
подскажите почему не работает программа? по этой статье все должно работать.. начал изучать шаблоны и понадобилось заполнить...

Явная специализация шаблонов
в 83 строке, когда создаю шаблонную функцию со специализацией для строк, появляется ошибка &quot;отсутствуют экземпляры шаблонов функции,...

Специализация Шаблонов класса в C++
Задание 1: - Реализуйте шаблонный тип с полем value, которое будет содержать true если в качестве шаблонного параметра...

10
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.03.2022, 01:35
Цитата Сообщение от alexey6689 Посмотреть сообщение
template <> char * max_elem(const char **arr, int c)
template <> const char* max_elem(const char* const * arr, int c)
1
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
08.03.2022, 02:11  [ТС]
Спасибо, сам бы я долго до этого доходил.
Цитата Сообщение от avgoor Посмотреть сообщение
const char* const * arr
Возможно, Visual C компилятор смог бы лучше и быстрее объяснить мне что он не может const объект передавать в не const. Ведь в этом получается дело было?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
08.03.2022, 02:29
Цитата Сообщение от alexey6689 Посмотреть сообщение
Возможно, Visual C компилятор смог бы лучше и быстрее объяснить мне что он не может const объект передавать в не const. Ведь в этом получается дело было?
Нет, дело было в том, что специализация шаблона никак не вписывается в его изначальное объявление. Что и объяснил компилятор.

Никакого отношения к "не может const объект передавать в не const" это не имеет.
1
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
08.03.2022, 17:22  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, дело было в том, что специализация шаблона никак не вписывается в его изначальное объявление.
Хорошо. Вот только как дойти до правильного объявления?
Вот есть
C++
1
2
template <typename T>
T max_elem(const T *arr, int c) { ... }
Я создаю специализацию для double, явно заменяя T на double:
C++
1
template <> double max_elem(const double *arr, int c) { ... }
Если в такой же манере заменить T на const char * (можно просто на char *, на результат компиляции шаблона это не влияет) получится:
C++
1
template <> const char * max_elem(const char **arr, int c) {
Почему для char * нужно добавить еще один const между звездочками и откуда это следует?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.03.2022, 17:47
alexey6689, еще можно добавить вот такое объявление, тогда скомпилируется твой первоначальный пример:
C++
1
2
template <typename T>
T * max_elem(const T **arr, int c);
1
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
08.03.2022, 18:12  [ТС]
Цитата Сообщение от _stanislav Посмотреть сообщение
еще можно добавить вот такое объявление
Да, знаю про такое и делал, работает. И тем более интересно почему это работает, а тоже самое через специализацию требует еще одного const. Со строками (массивы char) постоянно у меня какие-то проблемы, хочу разобраться.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.03.2022, 18:36
alexey6689,
тут суть наверное в том что специализация, должна быть более специализирована чем первичное объявление (а у тебя как бы не "специализация", а "совсем другое" объявление получается), вот если порассуждать такое получилось:
C++
1
template <> char* max_elem( char * const  * arr, int c);
Добавлено через 4 минуты
короче говоря указатель нижнего уровня должен указывать на константу (не уверен, если я не прав поправьте меня)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.03.2022, 21:50
Цитата Сообщение от alexey6689 Посмотреть сообщение
Почему для char * нужно добавить еще один const между звездочками и откуда это следует?
Второй const нужен потому, что вы сами в специализации заявили, что T = const char* (указав этот тип в возвращаемом значении).
Если бы вы заявили, что T = char*, то специализация выглядела бы так:
C++
1
2
template <> 
char* max_elem(char* const* arr, int c)  {  ... }
При этом const в специализации нужен потому, что ваш исходный шаблон задал "паттерн" как const T*. Т.е. ожидается, что будет "указатель на константный T". Вот эта запись
C++
1
char* const* arr
и означает соответствие этому "паттерну" в случае, если T = char*.

Кстати, тут может помочь понимание, что
const char* и char const* - это одно и то же.
Поэтому
T const* arr в случае T = char*, как char* const* arr, на мой взгляд воспримется легче.

А вообще рекомендую изучить вот это: https://habr.com/ru/post/116255/
2
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
08.03.2022, 23:15  [ТС]
Если мою исходную специализацию записывать именно как
Цитата Сообщение от DrOffset Посмотреть сообщение
T const* arr
то все получается само собой. У меня было написано const T *arr. Это одно и то же, но получается есть нюанс -)).
Видимо, шаблонный тип (T) надо писать самым первым - будет меньше проблем.

Спасибо, стало лучше -)).
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.03.2022, 23:37
Цитата Сообщение от alexey6689 Посмотреть сообщение
Видимо, шаблонный тип (T) надо писать самым первым - будет меньше проблем.
С этим можно поспорить, но я не стану, потому что сам так делаю.
В любом случае для вас не должно составлять трудностей читать обе формы (поэтому я и предложил получше разобраться как читаются типы в Си), потому что вы-то писать будете как вам понятнее, а вот остальные будут делать по-своему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2022, 23:37
Помогаю со студенческими работами здесь

Шаблоны. Специализация шаблонов
Задача: в программном коде необходимо иметь фамилию программиста, который является автором того или иного класса. Предложить решение с...

Явная специализация шаблонов
В явной специализации мы можем задать поведение функции для конкретного типа данных. Мне например хочется сделать явную специализацию для...

Специализация шаблонов С++ сразу по нескольким значениям параметров
Шаблоны задаются так: template&lt;int I, int J&gt; int func(){ return I + J; } Специализация шаблона на одно значение так: ...

error: explicit specialization in non-namespace scope - специализация шаблонов
Изучаю шаблоны и не могу нормально скомпилировать код. Версия компилятора - g++ (Debian 10.2.1-6) 10.2.1 20210110 #include...

Явная специализация, зачем она нужна?(Шаблоны функций)
Какой смысл в явной специализации, когда есть перегрузка? если можно, и примерчик) я себе уже в голову вбил, и тут надо чем-то тяжелым...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru