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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.61
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 08:58     Шаблон структуры #1
можно ли в с++ создать шаблон структуры? Не класса, именно структуры.

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

И то же самое, но с int'ами. Могу сделать обобщенную структуру? И как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2012, 08:58     Шаблон структуры
Посмотрите здесь:

C++ Динамические структуры данных. Программа ввода в структуры и вывода информации из неё.
C++ Шаблон структуры данных - массив указателей на заголовки списков
Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры) C++
Функция внутри структуры использует указатель, как поле этой структуры C++
C++ Шаблон структуры данных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
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;
}
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 09:11  [ТС]     Шаблон структуры #3
Что означают переменные a,b в 10, 11 строчках?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.10.2012, 09:19     Шаблон структуры #4
объекты класса A.
Gregory_Mas
3 / 3 / 0
Регистрация: 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: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)

Прошу помощи!!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 09:57     Шаблон структуры #6
Что у вас за B в 26 строке?
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 10:02  [ТС]     Шаблон структуры #7
Опечатка; удаление сути не меняет.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
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;
}
alsav22
5282 / 4801 / 442
Регистрация: 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;
};
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 10:17  [ТС]     Шаблон структуры #10
С парой я не знаком, увы. Если есть способ сделать через структуру, помогите пожалуйста)

И сразу вопросы. Что означает const*?
В данном случае пара является типом функции?
Если это тип функции, то потом объявляется пара, к-ая и возвращается, так?
Поясните 22-ую строчку, пожалуйста - не врубаюсь в её смысл.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
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;
}
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 11:22  [ТС]     Шаблон структуры #12
igorrr37, Без указателей тут нельзя обойтись?
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
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;
}
alsav22
5282 / 4801 / 442
Регистрация: 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;
}
Gregory_Mas
3 / 3 / 0
Регистрация: 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();
}
DU
1477 / 1053 / 45
Регистрация: 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);
alsav22
5282 / 4801 / 442
Регистрация: 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;
...
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.10.2012, 12:50     Шаблон структуры #18
да у вас в коде функция rec принимает только один шаблонный параметр. там неоднозначностей вообще не будет никаких. но у ТС совсем другая сигнатура функции и вот в том коде ошибки такие могут быть.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 13:09     Шаблон структуры #19
Цитата Сообщение от DU Посмотреть сообщение
да у вас в коде функция rec принимает только один шаблонный параметр. там неоднозначностей вообще не будет никаких. но у ТС совсем другая сигнатура функции и вот в том коде ошибки такие могут быть.
Да, вы правы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 13:22     Шаблон структуры
Еще ссылки по теме:

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон C++
Вывод структуры, строка как элемент структуры C++
C++ Шаблон функции, использующий поля структуры

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

Или воспользуйтесь поиском по форуму:
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 13:22  [ТС]     Шаблон структуры #20
DU,
alsav22,
ДА!!! После суток мучений наконец-то программа откомпилировалась и работает!!!

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

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

Добавлено через 3 минуты
Только вот непонятно - почему после приема с флоатом компилятор отказывался воспринимать тип Т?
Yandex
Объявления
14.10.2012, 13:22     Шаблон структуры
Ответ Создать тему
Опции темы

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