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

Шаблонный класс. Ошибка : aggregate 'Box<info*> ob' has incomplete type and cannot be defined - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Посчитать количество нулевых элементов в массиве, вывести их индексы http://www.cyberforum.ru/cpp-beginners/thread1303562.html
делаю лабу, наполовину завершил, но наткнулся на эту задачу, хэлп.. Написать программу определения количества и номера индексов нулевых элементов массива вещественных чисел. Вывести на экран найденное количество, а также все найденные номера индексов. Заранее Thank's!
C++ Функции друзья в отдельном файле Здравствуйте уважаемые программисты ! У меня вопрос. При разбивке проекта, класс поместил в заголовочный файл, а как быть с его функциями друзьями ?) Тоже к нему в хэдер добавить ? Ведь прототип функции-друга находится внутри класса, и новый прототип за пределами класса с ключевым словом friend, создать не получится. http://www.cyberforum.ru/cpp-beginners/thread1303547.html
C++ Преобразовать в рекурсивную функцию
Помогите преобразовать следующий код так, чтобы вычисление функции происходило с помощью рекурсии... #include <cstdlib> #include <iostream> #include <math.h> using namespace std;
C++ Объединение чисел в пары
Нужна небольшая помощь. Задание звучит так: Даны n пар положительных чисел: (a1,b1),(a2,b2),...,(An,Bn). Определить: а)в какой паре среднее арифметическое значений чисел является максимальным. Если пар с макс. значением среднего арифметического несколько, найти номер последней из них; б)в какой паре среднее геометрическое значений чисел является максимальным. Если таких пар несколько, найти...
C++ LNK2019: о private и public в классе http://www.cyberforum.ru/cpp-beginners/thread1303538.html
Всем суп, есть беда: // "NAbstractNumber.h" class NAbstractNumber{ NAbstractNumber(){}; virtual std::string toString(int base = 10) const = 0; virtual NAbstractNumber & operator = (const NAbstractNumber &) = 0; };
C++ Считывание отрицательных чисел из файла Собственно как считать из файла отрицательное число? Положительные числа считываются нормально, при считывание отрицательных программа зависает. подробнее

Показать сообщение отдельно
Gr1f0nn
82 / 81 / 42
Регистрация: 30.09.2012
Сообщений: 408
18.11.2014, 22:36  [ТС]     Шаблонный класс. Ошибка : aggregate 'Box<info*> ob' has incomplete type and cannot be defined
В итоге, после некоторых мучений, я все-таки запустил программу и она даже почти корректно работает ^_^
Основные шаблонные функции(добавить в начало\конец, удалить начало\конец\все и т.п.) работают.
Вот измененный шаблон:
Кликните здесь для просмотра всего текста
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
#ifndef BOX_H
#define BOX_H
#include "info.h"
#include <iostream>
#include <cstring>
#include <string>
#include <fstream>
using namespace std;
 
template <typename X> struct infr
{
    infr<X>
            *next,
            *prev;
    X
            data_;
};
 
template <typename X> class Box
{
private:
    infr<X> *head, *tail;
    int size_;
public:
    Box()
    {
        head = NULL;
        tail = NULL;
        size_ = 0;
    }
 
    ~Box()
    {
        clear();
    }
 
   Box(const Box &x)
    {
        infr<X>
                *temp,
                *curr;
        string
                msg,
                nick;
        head = tail = NULL;
        size_ = 0;
        curr = x.head;
        do {
            if(curr->get_type() == "info") {
                msg = curr->get_m();
                temp = new typename X::base(msg);
            } else {
                msg = curr->get_m();
                nick = curr->get_n();
                temp = new X(msg,nick);
            }
            push_back(temp);
            curr = curr->next;
        } while (curr != NULL);
    }
 
    void push_back(infr<X> *x)
    {
        infr<X>
                *temp;
        temp = x;
        if (!head) {
            tail = head = temp;
            tail->next = NULL;
            tail->prev = NULL;
            size_ ++;
        } else {
            tail->next = temp;
            temp->prev = tail;
            tail = temp;
            tail->next = NULL;
            size_ ++;
        }
    }
 
    void push_front(infr<X> *x)
    {
        infr<X>
                *temp;
        temp = x;
        if (!head) {
            tail = head = temp;
            tail->next = NULL;
            tail->prev = NULL;
            size_ ++;
        } else {
            temp->next = head;
            head->prev = temp;
            head = temp;
            size_ ++;
        }
    }
 
    void pop_back()
    {
       infr<X>
                *temp;
        if (head) {
            temp = tail;
            tail = temp->prev;
            tail->next = NULL;
            delete temp;
            size_ --;
        }
    }
 
    void pop_front()
    {
        infr<X>
                *temp;
        if (head) {
            temp = head;
            head = temp->next;
            head->prev = NULL;
            delete temp;
            size_ --;
        }
    }
 
    void erase(infr<X> *p)
    {
        infr<X>
                *temp;
        temp = p;
        if (temp == begin()) {
            pop_front();
        } else {
            if (temp == end()) {
                pop_back();
            } else {
                if (temp != begin() && temp != end()) {
                    temp->prev->next = temp->next;
                    temp->next->prev = temp->prev;
                    delete temp;
                    size_--;
                }
        }
    }
    }
 
    int size() const
    {
        return size_;
    }
    infr<X> *begin() const
    {
        return head;
    }
    infr<X> *end() const
    {
        return tail;
    }
    void read()
    {
        string
                type;
        X
                *temp;
        infr<X>
                *pole;
        ifstream fin("data");
        if(fin)
        {
            do
            {
                fin >> type;
                if (type == "info") {
                    temp = new  X();
                } else {
                    temp = new typename X::derived();
                }
                fin >> temp;
                pole = new infr<X>;
                pole->data_ = temp;
                push_back(pole);
            }
            while(!fin.eof());
        }
        fin.close();
    }
 
    void save()
    {
       infr<X>
                *temp;
        ofstream
                fout("data");
        if (head) {
            temp = head;
            do {
                fout << temp;
                temp = temp->next;
            } while (temp != NULL);
        }
        fout.close();
    }
 
    bool empty()
    {
        if (head) {
            return 0;
        } else {
            return 1;
        }
    }
 
    void clear()
    {
        infr<X>
                *temp;
        while(head != NULL)
        {
            temp = head;
            head = head->next;;
            delete temp;
        }
        head = tail = NULL;
        size_ = 0;
    }
 
    infr<X> *operator[] (int i)
    {
        infr<X>
                *temp;
        int
                j;
        if (!empty())
            if (i >= 1 && i <= size()) {
                temp = head;
                for( j=0 ; j<i ; j++ ) {
                    temp = temp->next;
                }
                return temp;
            }
        return NULL;
    }
 
    infr<X> *operator() (int i)
    {
        return ((*this)[i]);
    }
 
    Box &operator=(const Box &x)
    {
        infr<X>
                *temp,
                *curr;
        string
                msg,
                nick;
        if(this != &x)
        {
            curr = x.head;
            clear();
            do {
                if(curr->get_type() == "info") {
                    msg = curr->get_m();
                    temp = new typename X::base(msg);
                } else {
                    msg = curr->get_m();
                    nick = curr->get_n();
                    temp = new X(msg,nick);
                }
                push_back(temp);
                curr = curr->next;
            } while (curr != NULL);
        }
        return *this;
    }
 
    friend Box operator+(const Box b,  infr<X> i)
    {
        Box<X> temp;
        temp = b;
        infr<X> *p;
        p = i;
        temp.push_back(p);
        return temp;
    }
 
    friend Box operator+( infr<X> i, const Box b)
    {
        return (b + i);
    }
 
    friend Box operator -(Box b, int i)
    {
        Box<X> temp;
        temp = b;
        infr<X> *p;
        p = temp.begin();
        int j;
        if (i>=1 && i<=temp.size() ) {
            if (i == 1) {
 
                temp.pop_front();
            } else {
                for(j=0 ; j<i ; j++)
                {
                    p = p->next;
                }
                temp.erase(p);
            }
        }
        return temp;
    }
 
    friend Box operator -(int i, Box b)
    {
        return (b - i);
    }
 
    Box operator+=(infr<X> *i)
    {
        push_back(i);
        return *this;
    }
 
    Box operator-=(int i)
    {
        infr<X> *p;
        p = begin();
        int j;
        if (i>=1 && i<=size() ) {
            if (i == 1) {
 
                pop_front();
            } else {
                for(j=0 ; j<i ; j++)
                {
                    p = p->next;
                }
                erase(p);
            }
        }
        return *this;
    }
 
    Box &operator--()
    {
        pop_back();
        return *this;
    }
 
    Box operator--(int notused)
    {
        Box<X> temp = *this;
        --(*this);
        return temp;
    }
};
#endif // BOX_H


Не работает на данный момент функция read

Кликните здесь для просмотра всего текста
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
void read()
    {
        string
                type;
        X
                *temp;
        infr<X>
                *pole;
        ifstream fin("data");
        if(fin)
        {
            do
            {
                fin >> type;
                if (type == "info") {
                    temp = new  X();
                } else {
                    temp = new typename X::derived(); // ругается на эту строчку
                }
                fin >> temp;
                pole = new infr<X>;
                pole->data_ = temp;
                push_back(pole);
            }
            while(!fin.eof());
        }
        fin.close();
    }

Сделал, как Вы посоветовали, то есть написал
C++
1
typedef infoD derived;
Только уже в базовом классе.
Выдает такую ошибку:
Код
ошибка: 'info*' is not a class, struct, or union type
Также еще выдает ошибку насчет того, что нет оператора ввода
Код
ошибка: no match for 'operator>>' in 'fin >> temp'
Данный оператор перегружен в классах info и infoD. Как я понял, компилятор хочет, чтобы функция была шаблонной?
 
Текущее время: 02:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru