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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
#1

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

10.11.2013, 13:21. Просмотров 837. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 13:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Специализация шаблона (C++):

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

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

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

Частичная специализация шаблона - C++
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса #include &lt;iostream&gt; using...

Специализация операции шаблона - C++
Доброго времени суток. Имеется шаблон: template&lt;class Type&gt;class Figures { /*...*/ public: /*...*/ void...

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

12
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2013, 13:42 #2
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  [ТС] #3
Цитата Сообщение от 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
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2013, 13:58 #4
Цитата Сообщение от 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  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
это функция стандартной библиотеки. Я так понял, что проблема всё же со специализацией шаблона, а не с поиском максимума, поэтому написал с использованием стандартной функции.
std::size_t тип задающий размер (кол-во элементов). Внутри, скорее всего, беззнаковый целый тип.
char** - указатель на (char*), т.е. по сути, указатель на Си-строку.
Стоп. char* это же и есть строка в стиле С, это же указатель на первый элемент массива.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2013, 14:55 #6
указатель на строку не есть указатель на символ.
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  [ТС] #7
Цитата Сообщение от Tulosba Посмотреть сообщение
указатель на строку не есть указатель на символ.
C++
1
2
char* c; // указатель на символ (в частности на первый символ строки)
char s[]; // массив символов
C++
1
2
char** p; // указатель на указатель на символ
char* arr[]; // массив строк
Честно, не понимаю
Зачем нам делать указатель на указатель символа, если в аргументах нам требуется массив, т.е. указатель на первый элемент массива, получается должно хватить только char * arg или char arg[]?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2013, 15:13 #8
Цитата Сообщение от 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  [ТС] #9
Цитата Сообщение от Tulosba Посмотреть сообщение
массив указателей на char.
C++
1
char* arr[];
или, что то же самое:
C++
1
char** arr;
Что вообще из себя массив указателей на char представляет? Двумерный массив?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2013, 15:41 #10
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Что вообще из себя массив указателей на char представляет?
массив указателей это массив указателей
Ничем не отличается от другого массива. А вот как обращаться с указателем (который есть элемент массива) это уже дело десятое. Можно рассматривать его как Си-строку, тогда можно читать символы пока не встретим нулевой символ. А можно рассматривать просто как указатель на один единственный символ. И тогда читать что-либо дальше этого указателя нельзя.
0
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 15:44  [ТС] #11
Цитата Сообщение от Tulosba Посмотреть сообщение
массив указателей это массив указателей
Ничем не отличается от другого массива. А вот как обращаться с указателем (который есть элемент массива) это уже дело десятое. Можно рассматривать его как Си-строку, тогда можно читать символы пока не встретим нулевой символ. А можно рассматривать просто как указатель на один единственный символ. И тогда читать что-либо дальше этого указателя нельзя.
Т.е. например в массиве указателей на int может храниться указатель на char, получается?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2013, 15:46 #12
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Т.е. например в массиве указателей на int может храниться указатель на char, получается?
Это из чего такой вывод?
0
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 17:05  [ТС] #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Это из чего такой вывод?
Нет нет, сглупил, указатель же на тип, а не на переменную
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2013, 17:05
Привет! Вот еще темы с ответами:

Явная специализация шаблона - C++
Столкнулся с проблемой при изучении шаблонов. Задача: написать шаблонную функцию, которая принимает в качестве аргумента массив...

Явная специализация шаблона - C++
Здравствуйте, подскажите, пожалуйста, почему не выполняется неявное приведение фактических параметров к формальным при вызове функции для...

Специализация шаблона функции - C++
Как сделать специализированную функцию шаблон на тип int? У меня что-то не получается ..

Специализация шаблона класса - C++
Имеется задание: Создать свой шаблонный класс – динамический массив (myvector). Создать методы этого класса. Инстанцировать для своего...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
10.11.2013, 17:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru