Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70

Наследование шаблона структуры

09.12.2019, 15:18. Показов 3988. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня такой вопрос. Возможно ли унаследовать шаблону класса шаблон структуры, для того чтобы переменную типа struct мы могли использовать в нашем шаблоне класса. Почему такой вопрос, мне необходимо что бы поле структуры изменялось в зависимости от передаваемого типа данных обьекту шаблонного класса.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2019, 15:18
Ответы с готовыми решениями:

Наследование шаблона
Есть два шаблона Array and NumericArray Хочется реализовать между ними иерархию типа NumericArray диревативынй класс а Array...

Шаблон параметр шаблона и наследование
Есть вот такой базовый класс, который описывает абстрактный доступ к контейнеру stl: template< template<typename, typename>...

Как правильно производится наследование элементов от шаблона класса? В чем ошибка?
Приведу чисто условный пример. Есть какой-нибудь шаблон класса: template <class tempType> class Base { protected: tempType...

39
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 21:14  [ТС]
Студворк — интернет-сервис помощи студентам
изменил, но ошибки как были так и остались, ошибка на 15 строке никуда не исчезла, я понимаю, что я ничего не изменил, но надо ли менять в том месте что-нибудь
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 21:18
Цитата Сообщение от lack1253 Посмотреть сообщение
изменил, но ошибки как были так и остались, ошибка на 15 строке никуда не исчезла, я понимаю, что я ничего не изменил, но надо ли менять в том месте что-нибудь
Ну и почему же вы не приводите текст ошибки? )

Добавлено через 2 минуты
А, это эта что-ль ошибка?
Цитата Сообщение от lack1253 Посмотреть сообщение
'node': use of class template requires template argument.
Я же вам написал выше.
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы потеряли где-то шаблонный аргумент.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    void push(T a, node<T> *&t) // <--- ВОТ ГДЕ ВЫ ЕГО ПОТЕРЯЛИ
    {
        if (t == NULL)                   //Если дерева не существует
        {
            t = new node;                //Выделяем память
            t->info = a;                 //Кладем в выделенное место аргумент a
            t->l = t->r = NULL;       //Очищаем память для следующего роста
            return;                         //Заложили семечко, выходим
        }
        //Дерево есть
        if (a >= t->info) push(a, t->r);
        else push(a, t->l);
    }
Собственно.
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 21:22  [ТС]
'node': use of class template requires template argument list

Добавлено через 3 минуты
По такому же принципу я должен изменить везде в параметрах функций, к примеру в функции print node*t на node<T>*t, DrOffset, так?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 21:31
Цитата Сообщение от lack1253 Посмотреть сообщение
так?
Да, у вас же node теперь шаблонный класс.
1
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 21:42  [ТС]
теперь у меня ошибки с этой функцией
C++
1
2
3
4
5
6
int count(node<T>*t)
    {
        if (t == 0) return 0;
        if ((t->l == 0) && (t->r == 0)) return 1;
        return(count(t->l) + count(t->r));
    }
достаточно много ошибок:
Error C2365 'Tree<int>::count': redefinition; previous definition was 'data member'
Error C2207 'Tree<T>::count': a member of a class template cannot acquire a function type
Error C2365 'Tree<T>::count': redefinition; previous definition was 'data member'
Error C2059 syntax error: 'if'
Error C2059 syntax error: 'return'
Error C2238 unexpected token(s) preceding ';'
У меня такой вопрос,DrOffset, Как правильно реализовать функцию
C++
1
2
3
4
5
6
7
8
9
10
11
T* WriteTree(int n)
    {
        T s;
        for (int i = 0; i < n; ++i)
        {
            cout << "ведите число  ";
            cin >> s;
            push(s, root);
        }
        return root;
    }
А именно какой переменной я должен присвоить результат выполнения функции и к тому же, после выше перечисленных изменений вы дает ошибку когда я выполняю команду tr.WriteTree(n);
Error C2039 'WriteTree': is not a member of 'Tree<int>'
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 21:49
lack1253, показывайте код целиком.

Цитата Сообщение от lack1253 Посмотреть сообщение
'WriteTree': is not a member of 'Tree<int>'
Если пишет, что not a member, значит так и есть. Попробуйте все-таки читать ошибки, а не сразу их пугаться
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 21:59  [ТС]
DrOffset, вот собственно весь код

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <iostream>
#include <time.h>
#include <fstream>
 
using namespace std;
 
template<class T>
struct node
{
public:
    T info;                           //Информационное поле
    node *l, *r;
};
 
 
 
template <class T> class Tree :public node<T>
{
 
public:
    node<T>* root{};
    size_t count{};
 
    Tree() = default;
 
    
    void push(const T& a)
    {
        push(a, root);
    }
 
 
    /*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
    void push(T a, node<T> *&t)
    {
        if (t == NULL)                   //Если дерева не существует
        {
            t = new node;                //Выделяем память
            t->info = a;                 //Кладем в выделенное место аргумент a
            t->l = t->r = NULL;       //Очищаем память для следующего роста
            return;                         //Заложили семечко, выходим
        }
        //Дерево есть
        if (a >= t->info) push(a, t->r);
        else push(a, t->l);
    }
 
    /*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
    void print(node<T> *t, int u)
    {
        if (t == NULL) return;
        else
        {
            print(t->l, ++u);
            for (int i = 0; i < u; ++i) cout << "    ";
            cout << t->info << endl;
            u--;
 
        }
        print(t->r, ++u);
    }
 
    void DelTree(node<T> *t)
    {
        if (!t)
            return;
        if (t->l != 0)DelTree(t->l);
        if (t->r != 0)DelTree(t->r);
        delete t;
        t = nullptr;
    }
 
 
    void CopyTree(node<T>*&rootnew, node<T>*rootold)
    {
        if (rootold->l != 0)
        {
            push((rootold->l)->info, rootnew); CopyTree(rootnew, rootold->l);
        }
        if (rootold->r != 0)
        {
            push((rootold->r)->info, rootnew); CopyTree(rootnew, rootold->r);
        }
    }
 
    Tree(const Tree  &ob)
    {
        if (ob.root == 0)root = 0;
        else {
            root = new node;
            root->info = ob.root->info;
            root->count = 1;
            root->l = 0;
            root->r = 0;
            CopyTree(root, ob.root);
        }
    }
 
    void PrintLeaves(node<T> *t)
    {
 
        if (t == 0)return;
        else if ((t->l == 0) && (t->r == 0)) {
            cout << "Лист:  " << t->info << endl;
 
        }
        else
        {
            PrintLeaves(t->l);
            PrintLeaves(t->r);
        }
    }
 
    int count(node<T>*t)
    {
        if (t == 0) return 0;
        if ((t->l == 0) && (t->r == 0)) return 1;
        return(count(t->l) + count(t->r));
    }
 
    T* WriteTree(int n)
    {
        T s;
        for (int i = 0; i < n; ++i)
        {
            cout << "ведите число  ";
            cin >> s;
            push(s, root);
        }
        return root;
    }
};
 
 
 
 
int main()
 
 
{
    setlocale(LC_ALL, "Russian");
    Tree <int> tr;
    int n;
    cout << "введите количество элементов  ";
    cin >> n;
    tr.WriteTree(n);
    cout << "ваше дерево\n";
//  tr.print(root, 0);
    cout << "Кол-во листьев: " << endl;
//  tr.PrintLeaves(tr.WriteTree(n));
//  tr.DelTree(tr.WriteTree(n));
    cin.ignore().get();
}
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 22:03  [ТС]
DrOffset, вот сами ошибки
Миниатюры
Наследование шаблона структуры  
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 22:19
Цитата Сообщение от lack1253 Посмотреть сообщение
Error C2365 'Tree<int>::count': redefinition; previous definition was 'data member'
Цитата Сообщение от lack1253 Посмотреть сообщение
size_t count{};
Цитата Сообщение от lack1253 Посмотреть сообщение
int count(node<T>*t)
Не видите ничего странного?
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 22:26  [ТС]
кажется устранил ошибку, просто я брал код который был дан в пример и забыл удалить, но одна ошибка до сих пор осталась
Error C2440 'return': cannot convert from 'node<T> *' to 'T *'
И по поводу функции WriteTree(int n), какой переменной мне присвоить значение выполнения данной функции, чтобы я дальше мог использовать другие функции,DrOffset?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 22:29
Цитата Сообщение от lack1253 Посмотреть сообщение
Error C2440 'return': cannot convert from 'node<T> *' to 'T *'
Не вижу зачем там вообще этот возврат указателя. Наверное лучше сделать так:
C++
1
2
3
4
5
6
7
8
9
10
    void WriteTree(int n)
    {
        T s;
        for (int i = 0; i < n; ++i)
        {
            cout << "ведите число  ";
            cin >> s;
            push(s);
        }
    }
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 22:40  [ТС]
Вот весь код, выдает ошибку что нет подходящего конструктора по умолчанию.DrOffset?
Сами ошибки:
Error C2512 'node': no appropriate default constructor available
Error C2955 'node': use of class template requires template argument list Шаблон


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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <iostream>
#include <time.h>
#include <fstream>
 
using namespace std;
 
template<class T>
struct node
{
public:
    T info;                           //Информационное поле
    node *l, *r;
};
 
 
 
template <class T> class Tree :public node<T>
{
 
public:
    node<T>* root{};
 
    Tree()
    {
        root = 0;
    }
 
    
    void push(const T& a)
    {
        push(a, root);
    }
 
 
    /*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
    void push(T a, node<T> *&t)
    {
        if (t == NULL)                   //Если дерева не существует
        {
            t = new node;                //Выделяем память
            t->info = a;                 //Кладем в выделенное место аргумент a
            t->l = t->r = NULL;       //Очищаем память для следующего роста
            return;                         //Заложили семечко, выходим
        }
        //Дерево есть
        if (a >= t->info) push(a, t->r);
        else push(a, t->l);
    }
 
    /*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
    void print(node<T> *t, int u)
    {
        if (t == NULL) return;
        else
        {
            print(t->l, ++u);
            for (int i = 0; i < u; ++i) cout << "    ";
            cout << t->info << endl;
            u--;
 
        }
        print(t->r, ++u);
    }
 
    void DelTree(node<T> *t)
    {
        if (!t)
            return;
        if (t->l != 0)DelTree(t->l);
        if (t->r != 0)DelTree(t->r);
        delete t;
        t = nullptr;
    }
 
 
    void CopyTree(node<T>*&rootnew, node<T>*rootold)
    {
        if (rootold->l != 0)
        {
            push((rootold->l)->info, rootnew); CopyTree(rootnew, rootold->l);
        }
        if (rootold->r != 0)
        {
            push((rootold->r)->info, rootnew); CopyTree(rootnew, rootold->r);
        }
    }
 
    Tree(const Tree  &ob)
    {
        if (ob.root == 0)root = 0;
        else {
            root = new node;
            root->info = ob.root->info;
            root->count = 1;
            root->l = 0;
            root->r = 0;
            CopyTree(root, ob.root);
        }
    }
 
    void PrintLeaves(node<T> *t)
    {
 
        if (t == 0)return;
        else if ((t->l == 0) && (t->r == 0)) {
            cout << "Лист:  " << t->info << endl;
 
        }
        else
        {
            PrintLeaves(t->l);
            PrintLeaves(t->r);
        }
    }
 
    int count(node<T>*t)
    {
        if (t == 0) return 0;
        if ((t->l == 0) && (t->r == 0)) return 1;
        return(count(t->l) + count(t->r));
    }
 
    void WriteTree(int n)
    {
        T s;
        for (int i = 0; i < n; ++i)
        {
            cout << "ведите число  ";
            cin >> s;
            push(s,root);
        }
    }
};
 
 
 
 
int main()
 
 
{
    setlocale(LC_ALL, "Russian");
    Tree <int> tr;
    int n;
    cout << "введите количество элементов  ";
    cin >> n;
    tr.WriteTree(n);
    cout << "ваше дерево\n";
//  tr.print(root, 0);
    cout << "Кол-во листьев: " << endl;
//  tr.PrintLeaves(tr.WriteTree(n));
//  tr.DelTree(tr.WriteTree(n));
    cin.ignore().get();
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 22:47
Цитата Сообщение от lack1253 Посмотреть сообщение
:public node<T>
Это зачем?

Цитата Сообщение от lack1253 Посмотреть сообщение
t = new node;
Здесь надо node<T>, в 92 строке тоже.

Цитата Сообщение от lack1253 Посмотреть сообщение
root = 0;
Это в конструкторе не нужно, у вас и так есть нициализация в node<T>* root{};
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 22:57  [ТС]
DrOffset,node<T>* root{}; получается здесь я инициализирую мой корень? могу ли я его заменить на node<T>* root=0?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 22:58
Цитата Сообщение от lack1253 Посмотреть сообщение
могу ли я его заменить на node<T>* root=0?
Да.
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 23:02  [ТС]
И такой еще вопрос, какую переменную я должен передать в функцию print при обьявлении ее в мэйне DrOffset?
Миниатюры
Наследование шаблона структуры  
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 23:10
Цитата Сообщение от lack1253 Посмотреть сообщение
какую переменную я должен передать в функцию print при обьявлении ее в мэйне
Вы можете передать tr.print(tr.root, 0);
но эту будет категорически неправильно, при условии, что вы используете класс.
Поэтому с этим методом, как и с остальными подобными, вы должны поступить так же, как и с методом push. Поле root и все методы, которые требуют передавать внутреннее состояние, необходимо убрать в private, чтобы использование класса стало оправданным. Т.е. чтобы не заставлять пользователя вашего класса в мейне лазить самому за деталями реализации.
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 23:13  [ТС]
На этапе выполнения ошибку выдает ,DrOffset.
Миниатюры
Наследование шаблона структуры  
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.12.2019, 23:15
Лучший ответ Сообщение было отмечено lack1253 как решение

Решение

Цитата Сообщение от lack1253 Посмотреть сообщение
На этапе выполнения ошибку выдает
А зачем вы так сделали?
Это вы так поняли мою фразу
Цитата Сообщение от DrOffset Посмотреть сообщение
Здесь надо node<T>, в 92 строке тоже.
Да?
Имелось-то ввиду, что вам надо заменить
C++
1
t = new node;
на
C++
1
t = new node<T>;
Нельзя же так буквально все воспринимать.
1
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 23:29  [ТС]
Простите меня, но уже бьюсь над этой задачей не один день и сегодня почти пол дня, голова уже не соображает, а сдать надо да завтра

Добавлено через 8 минут
DrOffset, огромное спасибо вам,выручили как никто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2019, 23:29
Помогаю со студенческими работами здесь

Ошибка при использованием Шаблона структуры в классе
Добрый день. У меня возникла проблема. При использовании шаблона структуры в классе компилятор выдает такую ошибку. Пытался сам...

Наследование конструктора от переменного шаблона
В С++ 11 появилась возможность унаследовать конструктора базового класса при помощи конструкции using. class A { public: ...

Наследование шаблоном шаблона (наследование конструктора)
Всем привет! Думаю, что эта тема хоть и касается общих вопросов программирования, но будет уместна в данном разделе т.к. у различных...

Наследование дизайна шаблона
Добрый вечер. На сайте есть множество однообразных страниц,которые отличаются лишь текстами в основном блоке. Хотелось бы сделать так,чтобы...

Наследование шаблона с другого приложения
Всем доброго времени суток. Я только недавно начал разбираться в django, поэтому прошу простить за душные вопросы. Есть в проекте...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru