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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.61
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
#1

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

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

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

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

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

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

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

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

Как работает шаблон структуры static_assert? - C++
Всем привет, объясните пожалуйста подробно почему данный код не компилируется? #include <iostream> template<bool> ...

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

Шаблон структуры данных - массив указателей на заголовки списков - C++
Мне выдали задание на курсовую работу: "Шаблон структуры данных - массив указателей на заголовки списков. Элемент списка содержит...

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

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

И сразу вопросы. Что означает const*?
В данном случае пара является типом функции?
Если это тип функции, то потом объявляется пара, к-ая и возвращается, так?
Поясните 22-ую строчку, пожалуйста - не врубаюсь в её смысл.
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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;
}
0
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
14.10.2012, 11:22  [ТС] #12
igorrr37, Без указателей тут нельзя обойтись?
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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;
}
0
alsav22
5419 / 4815 / 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;
}
1
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();
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 12:19
Привет! Вот еще темы с ответами:

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

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

Помещение структуры в вектор, удаление структуры, изменение элементов структуры - C++
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в векторе зная уникальный элемент структуры. 2 - удалять...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон - C++
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.10.2012, 12:19
Ответ Создать тему
Опции темы

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