Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/146: Рейтинг темы: голосов - 146, средняя оценка - 4.75
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
1

Шаблон структуры

14.10.2012, 08:58. Показов 27853. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
можно ли в с++ создать шаблон структуры? Не класса, именно структуры.

Т.е. есть у меня
struct A
{
float e;
float e1;
};

И то же самое, но с int'ами. Могу сделать обобщенную структуру? И как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2012, 08:58
Ответы с готовыми решениями:

Шаблон структуры
Создать шаблон структуры "владелец автомобиля" со следующими полями : фамилия, имя, номер...

Шаблон структуры данных
Всем привет, в универе дали задание, не понимаю совсем, напишите пожалуйста, Разработать шаблоны...

Шаблон структуры данных
Задание на курсовую работу: шаблон структуры данных – массив указателей на заголовки списков....

Шаблон структуры данных
Шаблон структуры данных – двухуровневый массив указателей на объекты. Массив верхнего уровня –...

26
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
14.10.2012, 09:03 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T>
struct A
{
  T e;
  T e1;
};
 
int main()
{
  A<int> a;
  A<double> b;
}
1
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 09:11  [ТС] 3
Что означают переменные a,b в 10, 11 строчках?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
14.10.2012, 09:19 4
объекты класса A.
0
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 09:28  [ТС] 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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "stdafx.h"
#include <iostream>
#include <ctime>
 
 
using namespace System;
using namespace std;
 
int m[200];
float m1[200];
 
template <class T>
struct A
{
  T e;
  T e1;
};
 
 
 
template<typename O>
T rec(O i,O max,O ind,O m[])
 
{
    int k,c,n;
B
      A<int> a;
  A<double> b;
    if ((i-1)>=-1)
    {
    i=i-1;
    k=m[i];
    return m[i] > max ? rec (i,m[i],i,m) : rec (i,max,ind,m);
    }
    else 
    {
        T B;
        B.e=max;
        B.e1=ind;
        
        return B;
    }
}
 
 
 
 
int main()
{
      A<int> a;
  A<double> b;
    srand(time(NULL));
    int n,i,j;
    j=1;
    if (j==0)
    {
        cout<<"Vvedite N(zelii massiv): ";
    cin>>n;
        for (i=0; i<=n; i++)
    {
        m[i]=(rand()%100);
        cout<<m[i]<<" ";
        
    }
            i=n+1;
            T B;
    B=rec(i,0,0,m);
    cout<<endl;
    cout<<"Max element: "<<B.e<<endl<<"Index: "<<B.e1;
    }
    else {
        cout<<"Vvedite N(real massiv): ";
    cin>>n;
        for (i=0; i<=n; i++)
    {
        m1[i]=(rand()%100-0.5);
        cout<<m1[i]<<" ";
        
    }
            i=n+1;
            T B;
    B=rec(i,0,0,m1);
    cout<<endl;
    cout<<"Max element: "<<B.e<<endl<<"Index: "<<B.e1;
    }
 
    cin.get();
    cin.get();
}
Выводит целую кучу ошибок:
1>Шаблон6.cpp(24): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "rec"
1>Шаблон6.cpp(24): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>Шаблон6.cpp(24): error C2065: O: необъявленный идентификатор
1>Шаблон6.cpp(24): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "i"
1>Шаблон6.cpp(24): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>Шаблон6.cpp(24): error C2059: синтаксическая ошибка: )
1>Шаблон6.cpp(51): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>Шаблон6.cpp(51): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)

Прошу помощи!!
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 09:57 6
Что у вас за B в 26 строке?
0
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 10:02  [ТС] 7
Опечатка; удаление сути не меняет.
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
14.10.2012, 10:06 8
если надо хранить два значения есть же std :: pair
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
#include <iostream>
#include <utility>
 
template<typename T>
std::pair<T, size_t> MaxElement(T const* p, size_t const size)
{
    std::pair<T, size_t> ret(*p, 0);
    for(size_t i = 1; i < size; ++i)
    {
        if(i[p] > ret.first)
        {
            ret.first = i[p];
            ret.second = i;
        }
    }
    return ret;
}
 
int main()
{
    int arr[] = {16, 27, -3};
    auto res = MaxElement(arr, sizeof(arr) / sizeof(*arr));
    std::cout << "value: " << res.first << "\nindex: " << res.second << std::endl;
    return 0;
}
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 10:09 9
По сути. Индекс массива может быть только целым числом. Значит в шаблоне структуры (если она предназначена для хранения индекса и значения) одно поле должно быть int:
C++
1
2
3
4
5
6
template <class T1>
struct A
{
  T val;
  int ind;
};
0
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 10:17  [ТС] 10
С парой я не знаком, увы. Если есть способ сделать через структуру, помогите пожалуйста)

И сразу вопросы. Что означает const*?
В данном случае пара является типом функции?
Если это тип функции, то потом объявляется пара, к-ая и возвращается, так?
Поясните 22-ую строчку, пожалуйста - не врубаюсь в её смысл.
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
14.10.2012, 10:30 11
пара определена в хедере <utility>, позволяет хранить два объекта.
T const* означает указатель на объект T и этот объект нельзя изменить через этот указатель.
auto ключевое слово стандарта c++11, позволяет автоматический вывод типа.
через структуру:
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
#include <iostream>
 
template<typename T1, typename T2>
struct Pair
{
    Pair(T1 const& first_, T2 const& second_) : first(first_), second(second_){}
    T1 first;
    T2 second;
};
 
template<typename T>
Pair<T, size_t> MaxElement(T const* p, size_t const size)
{
    Pair<T, size_t> ret(*p, 0);
    for(size_t i = 1; i < size; ++i)
    {
        if(i[p] > ret.first)
        {
            ret.first = i[p];
            ret.second = i;
        }
    }
    return ret;
}
 
int main()
{
    int arr[] = {16, 27, -3};
    Pair<int, size_t> res = MaxElement(arr, sizeof(arr) / sizeof(*arr));
    std::cout << "value: " << res.first << "\nindex: " << res.second << std::endl;
    return 0;
}
0
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 11:22  [ТС] 12
igorrr37, Без указателей тут нельзя обойтись?
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
14.10.2012, 11:46 13
можно, хоть так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename T>
Pair<T, size_t> MaxElement(T arr[], size_t const size)
{
    Pair<T, size_t> ret(0[arr], 0);
    for(size_t i = 1; i < size; ++i)
    {
        if(i[arr] > ret.first)
        {
            ret.first = i[arr];
            ret.second = i;
        }
    }
    return ret;
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 11:56 14
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
76
77
#include <ctime>
#include <iostream>
using namespace std;
 
const int N = 200;
 
int m[N];
double m1[N];
 
template <class T>
struct A
{
  T val;
  int ind;
};
 
template<typename T>
A<T> rec(T m[], int n)
{
        T max = 0;
        int ind = 0;
        for (int i = 0; i < n; i++)
        {
            if (m[i] > max) 
            {
                max = m[i];
                ind = i;
            }
        }
        
        A<T> B;
        B.val = max;
        B.ind = ind;
        
        return B;
}
 
 
int main()
{
    srand(time(NULL));
    
    int n;
    
    cout << "Vvedite N(zelii massiv, max " << N << ") : ";
    cin >> n;
    
    for (int i = 0; i < n; i++)
    {
        m[i] = (rand() % 100);
        cout << m [i] << " ";
    }
    
    A<int> B;       
    B = rec(m, n);
    
    cout << endl;
    cout << "Max element: "<< B.val << "  " << "Index: " << B.ind << endl;
    
    cout<<"Vvedite N(real massiv, max " << N << ") : ";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        m1[i] = (rand() % 100 - 0.5);
        cout << m1[i] << " ";
        
    }
    
    A <double> D;       
    D = rec(m1, n);
    
    cout << endl;
    cout << "Max element: " << D.val << "  " << "Index: " << D.ind << endl;
 
    system("pause");
    return 0;
}
1
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 12:19  [ТС] 15
igorrr37,
Что означает

Pair<T, size_t> ret(0[arr], 0);

Объявляем структуру ret вида Pair... А в скобках что? Еще более удивляет, ,что arr в кв. скобках...

Добавлено через 15 минут
alsav22, igorrr37, Почти работает. Я и сам уже дошел разными путями, в т.ч. и представленными выше, ровно до одной-единственной ошибки.

error C2782: A<O,int> rec(const int,O,int,O []): в шаблон параметр "O" неоднозначен
1> Шаблон6.cpp(24): см. объявление "rec"
1> может быть "float"
1> или "int"


Черт, забыл написать - функция должна быть рекурсивная, так что алгоритмы, представленные выше - не канают (рекурсии нет).

Полученный код (один из вариантов, где есть данная ошибка):
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
76
77
78
79
80
81
82
83
84
85
86
// шаблон6б.cpp: главный файл проекта.
 
#include "stdafx.h"
#include <iostream>
#include <ctime>
 
 
using namespace System;
using namespace std;
 
int m[200];
float m1[200];
 
template <class T>
struct A
{
  T e;
  int e1;
};
 
 
template<typename O>
A<O> rec(int i,O max,int ind,O m[])
 
{
    int k,c,n;
    if ((i-1)>=-1)
    {
    i=i-1;
    k=m[i];
    return m[i] > max ? rec (i,m[i],i,m) : rec (i,max,ind,m);
    }
    else 
    {
        A<T> B;
        B.e=max;
        B.e1=ind;
        
        return B;
    }
}
 
 
 
 
int main()
{
 
    srand(time(NULL));
    int n,i,j;
    j=1;
    if (j==0)
    {
        cout<<"Vvedite N(zelii massiv): ";
    cin>>n;
        for (i=0; i<=n; i++)
    {
        m[i]=(rand()%100);
        cout<<m[i]<<" ";
        
    }
            i=n+1;
            A<int> B;
    B=rec(i,0,0,m);
    cout<<endl;
    cout<<"Max element: "<<B.e<<endl<<"Index: "<<B.e1;
    }
    else {
        cout<<"Vvedite N(real massiv): ";
    cin>>n;
        for (i=0; i<=n; i++)
    {
        m1[i]=(rand()%100-0.5);
        cout<<m1[i]<<" ";
        
    }
            i=n+1;
            A<float> B;
    B=rec(i,0,0,m1);
    cout<<endl;
    cout<<"Max element: "<<B.e<<endl<<"Index: "<<B.e1;
    }
 
    cin.get();
    cin.get();
}
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.10.2012, 12:40 16
в строке 79 неоднозначный вывод.
компилятор пытается сам вывести аргументы шаблонной функции по аргументам в месте вызова.
а там второй параметр имеет тип int, а последний - матрица флоатов. поэтому для вывода одинакого хорошо подходят и int и float. т.е. имеем неоднозначность. нужно явно указать тип. скорее всего вам там нужен фломат. можно так:

C++
1
2
3
4
5
B=rec(i,0.0f,0,m1);
или
B=rec<float>(i,0,0,m1);
или
B=rec(i,float(0),0,m1);
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 12:47 17
Цитата Сообщение от DU Посмотреть сообщение
в строке 79 неоднозначный вывод.
Gregory_Mas, я же специально поменял float на double, чтобы не было этой ошибки:
C++
1
2
3
4
5
int m[N];
double m1[N];
...
 A <double> D;
...
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.10.2012, 12:50 18
да у вас в коде функция rec принимает только один шаблонный параметр. там неоднозначностей вообще не будет никаких. но у ТС совсем другая сигнатура функции и вот в том коде ошибки такие могут быть.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 13:09 19
Цитата Сообщение от DU Посмотреть сообщение
да у вас в коде функция rec принимает только один шаблонный параметр. там неоднозначностей вообще не будет никаких. но у ТС совсем другая сигнатура функции и вот в том коде ошибки такие могут быть.
Да, вы правы.
0
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 13:22  [ТС] 20
DU,
alsav22,
ДА!!! После суток мучений наконец-то программа откомпилировалась и работает!!!

Ошибка была в:
C++
1
template<typename O>
Все буквы O надо было заменить на букву T, т.к. после вариантов, предложенных тов. DU буква T не определялась.

Всем огромное спасибо за помощь!!

Добавлено через 3 минуты
Только вот непонятно - почему после приема с флоатом компилятор отказывался воспринимать тип Т?
0
14.10.2012, 13:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2012, 13:22
Помогаю со студенческими работами здесь

Как работает шаблон структуры static_assert?
Всем привет, объясните пожалуйста подробно почему данный код не компилируется? #include...

Шаблон функции, использующий поля структуры
В очередной раз у меня возникают проблемы с доступом к полям структуры, и на этот раз уже в...

Шаблон структуры данных - массив указателей на заголовки списков
Мне выдали задание на курсовую работу: &quot;Шаблон структуры данных - массив указателей на заголовки...

Написать функцию сравнения двух структур (шаблон структуры задается произвольно)
ЗАДАНИЕ: Написать функцию сравнения двух структур (шаблон структуры задается произвольно). ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru