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

Шаблоны функций c++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
24.07.2011, 12:37     Шаблоны функций c++ #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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <cstring>
 
using namespace std;
 
template <typename T>
T maxn(T *arr, int ArSize);
template <> char maxn (char **arr, int ArSize);
 
int main()
{
    cout << "Enter 6 integers to define the biggest: ";
    int array_int[6];
    cin >> array_int[0] >> array_int[1] >> array_int[2] >> array_int[3] >> array_int[4] >> array_int[5];
    maxn(array_int, 6);
    cout << array_int[0];
    
    cout << "\nEnter 4 numbers to define the biggest: ";
    double array_do[4];
    cin >> array_do[0] >> array_do[1] >> array_do[2] >> array_do[3];
    maxn(array_do, 4);
    cout << array_do[0];
    
    char *array_str[5];
    char *str1 = "It's the first string";
    char *str2 = "It's the second string";
    char *str3 = "It's the third string";
    char *str4 = "It's the fourth string";
    char *str5 = "It's the fith string";
    array_str[0] = str1;
    array_str[1] = str2;
    array_str[2] = str3;
    array_str[3] = str4;
    array_str[4] = str5;
    maxn(*array_str, 5);
    cout << "The longest string is " << array_str[0];
    
    system("pause > nul");
    return EXIT_SUCCESS;
}
 
template <typename T>
T maxn(T *arr, int ArSize)
{
         for (int i = 0; i < ArSize; i++)
         {
             if (arr[0] < arr[i])
             {
                    T temp = arr[0];
                    arr[0] = arr[i];
                    arr[i] = temp;
             }
         }
         return arr[0];
}
 
template <> char maxn (char **arr, int ArSize)
{
         for (int i = 0; i < ArSize; i++)
         {
             if (arr[0] < arr[i])
             {
                    char *temp = arr[0];
                    arr[0] = arr[i];
                    arr[i] = *temp;
             }
             if (arr[0] = arr[i])
             {
                    char *temp = arr[0];
                    arr[0] = arr[i];
                    arr[i] = *temp;
             }
         }
         return *arr[0];
}
Компилятор ругается на 8-ую строку "template-id `maxn<>' for `char maxn(char**, int)' does not match any template declaration", и на 58-ую строку "template-id `maxn<>' for `char maxn(char**, int)' does not match any template declaration; invalid function declaration".

Объясните пожалуйта, что не правильно и как исправить.
Заранее сэнкс
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2011, 12:37     Шаблоны функций c++
Посмотрите здесь:

C++ Шаблоны функций
C++ шаблоны функций на С++
C++ Шаблоны функций
C++ Шаблоны функций
C++ Шаблоны функций.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
24.07.2011, 13:02     Шаблоны функций c++ #2
C++
1
template <> char maxn (char *arr, int ArSize);
!!!
C++
1
if (arr[0] = arr[i])
???
C++
1
char str1[] = "It's the first string";
Добавлено через 1 минуту
бегло так посмотрел, помоему ты там напортачил с массивами. Этот кусок вобще
C++
1
2
3
4
5
6
7
8
9
10
11
12
char *array_str[5];
    char *str1 = "It's the first string";
    char *str2 = "It's the second string";
    char *str3 = "It's the third string";
    char *str4 = "It's the fourth string";
    char *str5 = "It's the fith string";
    array_str[0] = str1;
    array_str[1] = str2;
    array_str[2] = str3;
    array_str[3] = str4;
    array_str[4] = str5;
    maxn(*array_str, 5);
Daemon025
 Аватар для Daemon025
380 / 329 / 67
Регистрация: 06.12.2010
Сообщений: 900
24.07.2011, 13:04     Шаблоны функций c++ #3
да и максимальный проще находится:
C++
1
2
3
4
5
6
7
8
template<class T>
T maxn(T *arr,int size)
{
    T max = arr[0];
    for(int i=1; i<size; i++)
        if(arr[i]>max) max = arr[i];
    return max;
}
LosAngeles
Заблокирован
24.07.2011, 13:08     Шаблоны функций c++ #4
аа вот щас только задание прочитал, тогда так
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <cstring>
 
using namespace std;
 
template <typename T>
T maxn(T *arr, int ArSize);
template <> char* maxn (char **arr, int ArSize);
 
int main()
{
    cout << "Enter 6 integers to define the biggest: ";
    int array_int[6];
    cin >> array_int[0] >> array_int[1] >> array_int[2] >> array_int[3] >> array_int[4] >> array_int[5];
    maxn(array_int, 6);
    cout << array_int[0];
 
    cout << "\nEnter 4 numbers to define the biggest: ";
    double array_do[4];
    cin >> array_do[0] >> array_do[1] >> array_do[2] >> array_do[3];
    maxn(array_do, 4);
    cout << array_do[0];
 
    char *array_str[5];
    char str1[] = "It's the first string";
    char str2[] = "It's the second string";
    char str3[] = "It's the third string";
    char str4[] = "It's the fourth string";
    char str5[] = "It's the fith string";
    array_str[0] = str1;
    array_str[1] = str2;
    array_str[2] = str3;
    array_str[3] = str4;
    array_str[4] = str5;
    maxn(*array_str, 5);
    cout << "The longest string is " << array_str[0];
 
    system("pause > nul");
    return EXIT_SUCCESS;
}
 
template <typename T>
T maxn(T *arr, int ArSize)
{
         for (int i = 0; i < ArSize; i++)
         {
             if (arr[0] < arr[i])
             {
                    T temp = arr[0];
                    arr[0] = arr[i];
                    arr[i] = temp;
             }
         }
         return arr[0];
}
 
template <> char* maxn (char **arr, int ArSize)
{
         for (int i = 0; i < ArSize; i++)
         {
             if (arr[0] < arr[i])
             {
                    char *temp = arr[0]; //ошибка
                    arr[0] = arr[i];
                    arr[i] = *temp;
             }
             if (arr[0] = arr[i]) //ошибка
             {
                    char *temp = arr[0];
                    arr[0] = arr[i];
                    arr[i] = *temp;
             }
         }
         return *arr[0];
}
я там пометил где ещё остались ошибки, но на шаблоны ругаться не будет
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2011, 13:18     Шаблоны функций c++ #5
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cstring>
 
namespace my {
    
    template< typename T >
    T max(T* arr, int size)
    {
        T max = *arr;
        for (int i = 1; i < size; ++i)
        {
            if (arr[i] > max)
            {
                max = arr[i];
            }
        }
 
        return max;
    }
    
    template< > 
    const char* max<const char*> (const char** arr, int size)
    {
        const char* max_len_str = arr[0];
        std::size_t max_len = std::strlen(arr[0]);
        for (int i = 1; i < size; ++i)
        {
            std::size_t tmp = std::strlen(arr[i]);
            if (tmp > max_len)
            {
                tmp = max_len;
                max_len_str = arr[i];
            }
        }
 
        return max_len_str;
    }
}
 
int main()
{
    int array_int[6] = { 1, 9, 4, 3, 2, 7 };
    std::cout << my::max(array_int, 6) << '\n';
    
    double array_do[4] = { 2.34, 5.67, 3.14, 2.72 };
    std::cout << my::max(array_do, 4) << '\n';
       
    char* array_str[] = { "It's the first string",
                                "It's the second string",
                                "It's the third string",
                                "It's the fourth string",
                                "It's the fith string" };
    std::cout << my::max((const char**)array_str, 5) << '\n';
    system("pause");
    return 0;
}
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
24.07.2011, 19:00  [ТС]     Шаблоны функций c++ #6
Нда, все равно ничего не получается, там где if исправил на двойное равно, а в строке 63
C++
1
char *temp = arr[0];
вроде все правильно, ведь arr[0] это указатель на строку (str1) и *temp это тоже указатель на строку, даже компиль не ругается. Правда результат дурной выходит:

The longest string is:
tI's the first string

в чем проблемма?
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
25.07.2011, 13:02  [ТС]     Шаблоны функций c++ #7
Нашел ошибку!!! Если кому интересно, то главная ошибка была в строке 35, которая теперь должна выглядеть так:
C++
1
maxn(array_str, 5);
в шаблоне
C++
1
template <> char* maxn (char **arr, int ArSize)
не нужен второй if, причем первый if должен выглядеть так:
C++
1
if (strlen(arr[0]) < strlen(arr[i]))
Получается вот так:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <cstring>
 
using namespace std;
 
template <typename T>
T maxn(T *arr, int ArSize);
template <> char* maxn (char **arr, int ArSize);
 
int main()
{
    cout << "Enter 6 integers to define the biggest: ";
    int array_int[6];
    cin >> array_int[0] >> array_int[1] >> array_int[2] >> array_int[3] >> array_int[4] >> array_int[5];
    maxn(array_int, 6);
    cout << array_int[0];
 
    cout << "\nEnter 4 numbers to define the biggest: ";
    double array_do[4];
    cin >> array_do[0] >> array_do[1] >> array_do[2] >> array_do[3];
    maxn(array_do, 4);
    cout << array_do[0];
 
    char *array_str[5];
    char str1[] = "It's the first string";
    char str2[] = "It's the second string";
    char str3[] = "It's the third string";
    char str4[] = "It's the fourth string";
    char str5[] = "It's the fith string";
    array_str[0] = str1;
    array_str[1] = str2;
    array_str[2] = str3;
    array_str[3] = str4;
    array_str[4] = str5;
    maxn(array_str, 5);
    cout << "\nThe longest string is: \n" << array_str[0];
 
    system("pause > nul");
    return EXIT_SUCCESS;
}
 
template <typename T>
T maxn(T *arr, int ArSize)
{
         for (int i = 0; i < ArSize; i++)
         {
             if (arr[0] < arr[i])
             {
                    T temp = arr[0];
                    arr[0] = arr[i];
                    arr[i] = temp;
             }
         }
         return arr[0];
}
 
template <> char* maxn (char **arr, int ArSize)
{
         for (int i = 0; i < ArSize; i++)
         {
             if (strlen(arr[0]) < strlen(arr[i]))
             {
                    char *temp = arr[0]; 
                    arr[0] = arr[i];
                    arr[i] = temp;
             }
         }
         return *arr;
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 13:09     Шаблоны функций c++ #8
Цитата Сообщение от Yashman Посмотреть сообщение
Получается вот так:
криво получается, ибо входная последоватльность портится
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2011, 13:15     Шаблоны функций c++
Еще ссылки по теме:

C++ Шаблоны функций
шаблоны функций C++
Шаблоны функций C++

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

Или воспользуйтесь поиском по форуму:
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
25.07.2011, 13:15  [ТС]     Шаблоны функций c++ #9
Цитата Сообщение от Maxwe11 Посмотреть сообщение
криво получается, ибо входная последоватльность портится
портится, но моя цель не сохранить последовательность, а просто выполнить условие
Yandex
Объявления
25.07.2011, 13:15     Шаблоны функций c++
Ответ Создать тему
Опции темы

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