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

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

Восстановить пароль Регистрация
 
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
10.11.2013, 13:21     Специализация шаблона #1
Здравствуйте!

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

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

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

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