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

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

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

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

10.11.2013, 13:21. Просмотров 755. Ответов 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**, из за этого запутался еще больше.

Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 13:21     Специализация шаблона
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

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

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

Почему не срабатывает специализация шаблона? - C++
#include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; struct box { char mak; float m; float n; float y; float...

Частичная специализация шаблона функции - C++
Добрый день, помогите разобраться в чем проблема кода: template &lt;int X, int Y&gt; bool isSimple(){ return X%Y == 0 &amp;&amp;...


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

Или воспользуйтесь поиском по форуму:
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 17:05  [ТС]     Специализация шаблона #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Это из чего такой вывод?
Нет нет, сглупил, указатель же на тип, а не на переменную
Yandex
Объявления
10.11.2013, 17:05     Специализация шаблона
Ответ Создать тему
Опции темы

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