Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1

Специализация шаблона

10.11.2013, 13:21. Показов 2119. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Задача:
Создайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое число, представляющее собой количество элементов в массиве, и возвращает элемент с наибольшим значением. Проверьте ее в программе, которая использует шаблон данной функции с массивом из шести значений типа int и с массивом из четырех значений типа double. Программа также должна включать специализацию, которая использует в качестве аргумента массив указателей на char и количество указателей в качестве второго аргумента, а затем возвращает адрес самой длинной строки. Если имеется более одной строки наибольшей длины, функция возвращает адрес первой из них. Выполните проверку специализации на примере массива, состоящего из пяти указателей на строки.

Код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <Windows.h>
#include <cstring>
using namespace std;
 
#define rus setlocale(0,"rus");SetConsoleCP(1251);SetConsoleOutputCP(1251);
 
template <class T> T maxn (T* arr, T n);
 
template <> char * maxn <char*> (char*, char*);
 
 
int main()
{
    rus;
    int arr_int[5] = {32, 46, 91, 190, 191};
    cout << maxn(arr_int, 5);
    system("pause");
}
 
template <class T>
T maxn (T* arr, T n)
{
    int temp = arr[0];
    for (int i = 1; i < n; i++)
        if (arr[i] > temp) temp = arr[i];
    return temp;
}


Шаблон функции с численными массивами я составил, а специализацию объявить не могу - при компиляции выходит ошибка: (10): error C2912: явная специализация; "char *maxn<char*>(char *,char *)" не является специализацией функции-шаблона.

Помогите пожалуйста, в подобных темах замечаю, что вместо char* иногда ставят char**, из за этого запутался еще больше.

Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2013, 13:21
Ответы с готовыми решениями:

Специализация шаблона
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема? Компилятор: 1&gt;TemplateArr.obj : error LNK2005:...

Специализация шаблона
Всем доброго вечера! Возникает непонятная ошибка при создании специализации родового класса cl. В строке 10: template class...

специализация шаблона
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по особенному, написать можно вот так. ...

12
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2013, 13:42
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <cstdlib>
#include <algorithm>
 
template <class T>
T maxn( T* arr, std::size_t len )
{
    return *std::max_element( arr, arr+len );
}
 
template <>
char* maxn( char** str, std::size_t cnt )
{
    char* ret = nullptr;
    std::size_t mlen = 0;
 
    for( std::size_t i=0; i<cnt; ++i )
    {
        std::size_t len = std::strlen( str[i] );
        if( len > mlen )
        {
            ret = str[i];
            mlen = len;
        }
    }
    return ret;
}
 
int main(int argc, char *argv[])
{ 
    char* lines[] = { "one", "two", "three", "four" };
    int v[] = {1,2,10,3,15,0};
 
    std::cout << maxn( v, sizeof(v)/sizeof(*v) ) << std::endl;
    std::cout << maxn( lines, sizeof(lines)/sizeof(*lines) ) << std::endl;
 
    std::system( "pause" );
 
    return 0;
}
0
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 13:49  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <cstdlib>
#include <algorithm>
 
template <class T>
T maxn( T* arr, std::size_t len )
{
    return *std::max_element( arr, arr+len );
}
 
template <>
char* maxn( char** str, std::size_t cnt )
{
    char* ret = nullptr;
    std::size_t mlen = 0;
 
    for( std::size_t i=0; i<cnt; ++i )
    {
        std::size_t len = std::strlen( str[i] );
        if( len > mlen )
        {
            ret = str[i];
            mlen = len;
        }
    }
    return ret;
}
 
int main(int argc, char *argv[])
{ 
    char* lines[] = { "one", "two", "three", "four" };
    int v[] = {1,2,10,3,15,0};
 
    std::cout << maxn( v, sizeof(v)/sizeof(*v) ) << std::endl;
    std::cout << maxn( lines, sizeof(lines)/sizeof(*lines) ) << std::endl;
 
    std::system( "pause" );
 
    return 0;
}
Ну, maxelement думаю функция, которая автоматом максимальное значение возращает.
А что такое size_t и char** ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2013, 13:58
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Ну, maxelement думаю функция, которая автоматом максимальное значение возращает.
это функция стандартной библиотеки. Я так понял, что проблема всё же со специализацией шаблона, а не с поиском максимума, поэтому написал с использованием стандартной функции.
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
А что такое size_t и char** ?
std::size_t тип задающий размер (кол-во элементов). Внутри, скорее всего, беззнаковый целый тип.
char** - указатель на (char*), т.е. по сути, указатель на Си-строку.
0
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 14:44  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
это функция стандартной библиотеки. Я так понял, что проблема всё же со специализацией шаблона, а не с поиском максимума, поэтому написал с использованием стандартной функции.
std::size_t тип задающий размер (кол-во элементов). Внутри, скорее всего, беззнаковый целый тип.
char** - указатель на (char*), т.е. по сути, указатель на Си-строку.
Стоп. char* это же и есть строка в стиле С, это же указатель на первый элемент массива.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2013, 14:55
указатель на строку не есть указатель на символ.
C++
1
2
char* c; // указатель на символ (в частности на первый символ строки)
char s[]; // массив символов
C++
1
2
char** p; // указатель на указатель на символ
char* arr[]; // массив строк
0
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 15:04  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
указатель на строку не есть указатель на символ.
C++
1
2
char* c; // указатель на символ (в частности на первый символ строки)
char s[]; // массив символов
C++
1
2
char** p; // указатель на указатель на символ
char* arr[]; // массив строк
Честно, не понимаю
Зачем нам делать указатель на указатель символа, если в аргументах нам требуется массив, т.е. указатель на первый элемент массива, получается должно хватить только char * arg или char arg[]?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2013, 15:13
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
которая использует в качестве аргумента массив указателей на char
массив указателей на char.
C++
1
char* arr[];
или, что то же самое:
C++
1
char** arr;
0
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 15:27  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
массив указателей на char.
C++
1
char* arr[];
или, что то же самое:
C++
1
char** arr;
Что вообще из себя массив указателей на char представляет? Двумерный массив?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2013, 15:41
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Что вообще из себя массив указателей на char представляет?
массив указателей это массив указателей
Ничем не отличается от другого массива. А вот как обращаться с указателем (который есть элемент массива) это уже дело десятое. Можно рассматривать его как Си-строку, тогда можно читать символы пока не встретим нулевой символ. А можно рассматривать просто как указатель на один единственный символ. И тогда читать что-либо дальше этого указателя нельзя.
0
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 15:44  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
массив указателей это массив указателей
Ничем не отличается от другого массива. А вот как обращаться с указателем (который есть элемент массива) это уже дело десятое. Можно рассматривать его как Си-строку, тогда можно читать символы пока не встретим нулевой символ. А можно рассматривать просто как указатель на один единственный символ. И тогда читать что-либо дальше этого указателя нельзя.
Т.е. например в массиве указателей на int может храниться указатель на char, получается?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2013, 15:46
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Т.е. например в массиве указателей на int может храниться указатель на char, получается?
Это из чего такой вывод?
0
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 17:05  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Это из чего такой вывод?
Нет нет, сглупил, указатель же на тип, а не на переменную
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2013, 17:05
Помогаю со студенческими работами здесь

специализация шаблона
Добрый день! Хотелось бы сделать шаблонную функцию, у которой будет различная реализация в зависимости от того является ли шаблонный...

Специализация шаблона
Привет, у меня есть вот такой шаблон дерева: template &lt;typename T = int&gt; class Tree{ struct TreeItem{ // элемент дерева ...

Явная специализация шаблона
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода: template &lt;typename T&gt; void func(T &amp;blue, T...

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

Специализация шаблона функции
Допустим у нас имеется шаблон функции такой, в угловых скобках которого содержатся как типовые параметры (с ударением на букве И), так и...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru