Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
cherc
11 / 16 / 6
Регистрация: 02.05.2018
Сообщений: 473
Завершенные тесты: 4
1

Ошибка "Шаблон класса уже определен"

17.05.2019, 22:16. Просмотров 1660. Ответов 10
Метки нет (Все метки)

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
template <class T>
struct Node                             //Структура, являющаяся звеном списка
 {
 public:
    T data;                             //Значение x будет передаваться в список
    Node<T> *Next, *Prev;                 //Указатели на адреса следующего и предыдущего элементов списка
    Node(T _data) :data(_data), Next(0), Prev(0) {}  // конструктор по умолчанию     
};
 
template <class T>
 class MyList                              //Создаем тип данных Список
 {
public:
    Node<T> *Head;                 //Указатели на адреса начала списка и его конца
    Node<T> *Tail;
    int size;  // размер списка
 
    MyList():Head(0),Tail(0), size(0) {};    //Инициализируем адреса как пустые
    MyList(const MyList& list)   // конструктор копирования
    {
        Head = 0;
        Tail = 0;
        size = 0;
        for (int i=0; i<list.size-1; ++i)
        {
            Add(list.GetData(i));
        }
    }  
    MyList& operator=(const MyList& list)
    {
        while(size)
        {
            Remove(size-1);
        }
        for(int i = 0; i < list.size; ++i)
        {
            Add(list.GetData(i));
        }
        return *this;
    }   
    ~MyList()                           //Прототип деструктора
    {
        while (Head)                       //Пока по адресу на начало списка что-то есть
        {
            Tail = Head->Next;             //Резервная копия адреса следующего звена списка
            delete Head;                   //Очистка памяти от первого звена
            Head = Tail;                   //Смена адреса начала на адрес следующего элемента
        }
    }
    
    void Show()                       //Прототип функции отображения списка на экране
    {
        Node<T> *temp = Head;
 
        if(temp == 0)
        {
            cout << "Список пуст!" << endl;
        }
        else
        {
            while(temp)
            {
                temp->data.display();
                temp = temp->Next;
            }
        }
    }
    
    void Add(T data)                   //Прототип функции добавления элементов в список
    {
        Node<T> *temp = new Node<T>(data);               //Выделение памяти под новый элемент структуры
 
        if (Tail)
        {
            temp->Prev = Tail;
            Tail->Next = temp;
            Tail = temp;
        }
        else
        {
            Head = Tail = temp;
        }
 
        size++;
    }
    
    int GetSize()  // получаем размер списка
    {
        Node<T> *temp = Head;
        int i(0);
 
        while(temp)
        {
            i++;
            temp = temp->Next;
        }
 
        return i;
    }
    
    void Remove(int index)  // удаление по индексу
    {
        Node<T> *temp = Head;
 
        if ((index > size) || (index < 0))    //если указанный элемент не существует, то
        {   
            cout << "Задайте другой индекс!!!" << endl;  //выводим предупреждение на экран
        }
        else
        {
            for(int i = 0; i != index; i++)  //иначе, переходим до этого элемента
            {
                temp = temp->Next;
            }
 
        if (temp->Prev == 0)        //если удаляем первый элемент
        {
            if (size == 1)         //если этот элемент единственный
            {
                Head = 0;
                Tail = 0;
            }
            else                //если он первый, но не единственный
            {
                temp->Next->Prev = 0;
                Head = temp->Next;
            }
 
            delete temp;
            size--;
            return;
        }
 
        if (temp->Next == 0)        //если удаляем последний элемент, то
        {
            temp->Prev->Next = 0;   //предыдущий элемент указывает на NULL
            Tail = temp->Prev;        //указатель на последний элемент указывает на предпоследний
 
            delete temp;
            size--;
            return;
        }       
 
        //если элемент находится в центре списка
        if (temp->Next != 0 && temp->Prev != 0) 
        {
            temp->Prev->Next = temp->Next; //предыдущий элемент указывает на следующий
            temp->Next->Prev = temp->Prev; //следующий указывает на предыдущий
            delete temp;
            size--;
            return;
        }
    }
}
    
    void Clear() // ф-я для очищения списка, хотя детруктор и так долен очищать список после работы
    {
        while(Head)
        {
            Tail = Head->Next;
            delete Head;
            Head = Tail;
        }
    }
    
    Node<T>* GetNode(int index) const   // получаем элемент по индексу
    {
        if ((index > size) || (index < 0))    //если указанный элемент не существует, то
        {   
            cout << "Задайте другой индекс!!!" << endl;  //выводим предупреждение на экран
        }
        Node<T> *temp = Head;
        int i = 0;
        while(temp && i < index)
        {
            temp = temp->Next;
            i++;
        }
        return temp;
    }
 
    const T& GetData(int index) const
    {
        if(GetNode(index))
        {
            return GetNode(index)->data;
        }
        else
        {
            throw std::out_of_range("index out range");
        }
    }
 
    T& GetData(int index)
    {
        const auto& me = *this;
        const T& data = me.GetData(index);
        return const_cast<T&>(data);
    }
 
};
скрин ошибок прикрепил

До этого все работало, сломался после того как присобачил компаратор для сортировки и паттерн стратегия. Вернул все назад но ошибки не исчезли.
0
Миниатюры
Ошибка "Шаблон класса уже определен"   Ошибка "Шаблон класса уже определен"  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2019, 22:16
Ответы с готовыми решениями:

Шаблон: Метод text() не определен для объекта класса TreeWidget
Есть код:template&lt;MainMenuGenerator::ElementTypes type, class T&gt; TreeWidgetItem...

Ошибка: LNK2005 <Имя> уже определен в cities.obj
Определяю переменные для нескольких файлов программ, но получаю ошибки. Не могу найти решение....

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

Ошибка "Объект уже определен" (LNK2005)
если в ставить этот код в h файл то пишет ошибку не знаю уже как решить её не где нету enum Tabs с...

Ошибка "идентификатор не определен" при создании производного класса
всем доброго времени суток. пытаюсь создать производный класс для machine, в котором нужно вывести...

10
cherc
11 / 16 / 6
Регистрация: 02.05.2018
Сообщений: 473
Завершенные тесты: 4
17.05.2019, 22:25  [ТС] 2
если не подключать "Strategy.h" ошибки исчезают

Вот содержимое "Strategy.h"
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
#include "MyList.h"
 
// Иерархия классов, определяющая алгоритмы сортировки списка
class Sort
{
public:
    virtual ~Sort() {}
    virtual void sort(const MyList<Banner> &list) = 0;
};
 
class RDA_Sort : public Sort
{
public:
    void sort(const MyList<Banner> &list)
    {
        std::cout << "RDA_Sort" << endl; 
    }
};
 
class RDI_Sort : public Sort
{
public:
    void sort(const MyList<Banner> &list)
    {
        std::cout << "RDI_Sort" << endl; 
    }
};
 
// Класс для использования
class MySort
{
private:
    Sort* p;
public:
    MySort(Sort* _sort) : p(_sort) {}
    ~MySort() {delete p; }
    void sort(const MyList<Banner> &list)
    {
        p->sort(list);
    };
};
0
zayats80888
1752 / 979 / 419
Регистрация: 07.02.2019
Сообщений: 2,654
17.05.2019, 22:28 3
Лучший ответ Сообщение было отмечено cherc как решение

Решение

Цитата Сообщение от cherc Посмотреть сообщение
sort(const MyList<Banner> &list)
а как сортировать константный список?
1
cherc
11 / 16 / 6
Регистрация: 02.05.2018
Сообщений: 473
Завершенные тесты: 4
17.05.2019, 22:30  [ТС] 4
zayats80888, ошибки не исчезли (
0
17.05.2019, 22:30
zayats80888
1752 / 979 / 419
Регистрация: 07.02.2019
Сообщений: 2,654
17.05.2019, 22:32 5
На скрине я вижу список указателей, а в sort список экземпляров
1
cherc
11 / 16 / 6
Регистрация: 02.05.2018
Сообщений: 473
Завершенные тесты: 4
17.05.2019, 22:37  [ТС] 6
zayats80888, я в sort передаю другой список, я никакие методы из "Strategy.h" не вызываю, никаких классов не создаю, а ошибки почему то из-за него появляются
0
cherc
11 / 16 / 6
Регистрация: 02.05.2018
Сообщений: 473
Завершенные тесты: 4
17.05.2019, 22:39  [ТС] 7
на скрине выделил синим список который я туда буду передавать
0
Миниатюры
Ошибка "Шаблон класса уже определен"  
zayats80888
1752 / 979 / 419
Регистрация: 07.02.2019
Сообщений: 2,654
17.05.2019, 23:03 8
там в ошибках указан файл и номер строки, их нужно глянуть

Добавлено через 1 минуту
Лучше скиньте архив с проектом, что бы не засорять тему
0
cherc
11 / 16 / 6
Регистрация: 02.05.2018
Сообщений: 473
Завершенные тесты: 4
17.05.2019, 23:07  [ТС] 9
zayats80888,
0
Вложения
Тип файла: rar ТиМП 4 семестр.rar (14.79 Мб, 1 просмотров)
zayats80888
1752 / 979 / 419
Регистрация: 07.02.2019
Сообщений: 2,654
17.05.2019, 23:41 10
Лучший ответ Сообщение было отмечено cherc как решение

Решение

в MyList.h добавь #pragma once, и вообще нужно делать защиту заголовков
1
cherc
11 / 16 / 6
Регистрация: 02.05.2018
Сообщений: 473
Завершенные тесты: 4
17.05.2019, 23:45  [ТС] 11
zayats80888, спасибо, работает
0
17.05.2019, 23:45
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2019, 23:45

int glob уже определен в main.obj
Почему #ifndef не помогает? 1.h: #ifndef ONE_H #define ONE_H int glob; #endif

Шаблон класса,ошибка TEMPLATE
Вечер добрый,с таким вопросом. Задание: шаблон класса &quot;однонарпавленный линейный список&quot;. И...

Шаблон класса. Ошибка `undefined reference`
Доброго вечера. В следующем коде описывается незамысловатый шаблон. При разгрузке кода (т.е в 3...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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