Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 16
1

Ошибка при подключении заголовочного файла

02.06.2019, 21:44. Показов 299. Ответов 10
Метки нет (Все метки)

При запуске возникают ошибки:
1. LNK2019 Ссылка на неразрешенный внешний символ "public: __cdecl tree<int>::tree<int>(void)" (??0?$tree@h@QEAA@XZ) в функции main (файл main.obj)
2. LNK1120 Неразрешенных внешних элементов: 1 (файл tree.exe)

Как их исправить?

tree.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
#pragma once
#include <xmemory>
template <typename _ty> class tree {
public:
    tree();
    tree(_ty data);
    void insert(_ty data);
private:
    typedef enum { BLACK, RED } node_color;
    _ty data;
    node_color color;
    tree* parent;
    tree* left;
    tree* right;
    tree* r;
    tree* root();
    tree* grandparent(tree* node);
    tree* uncle(tree* node);
    tree* insert_case1(tree* node);
    tree* insert_case2(tree* node);
    tree* insert_case3(tree* node);
    tree* insert_case4(tree* node);
    tree* insert_case5(tree* node);
    tree* rotate_left(tree* node);
    tree* rotate_right(tree* node);
};
tree.cpp
--------------------
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
#include "tree.h"
 
template <typename _ty> tree<_ty>::tree() {
    this->color = BLACK;
    this->parent = NULL;
    this->left = NULL;
    this->right = NULL;
}
 
template <typename _ty> tree<_ty>::tree(_ty data) {
    this->data = data;
    this->color = RED;
    this->parent = NULL;
    this->left = NULL;
    this->right = NULL;
}
 
template <typename _ty> void tree<_ty>::insert(_ty data) {
    tree* root = root();
    tree* node = root;
    tree* leaf(data);
    if (!this->r)
        root = leaf;
    else
        while (true) {
            if (node->data > data) {
                if (node->left)
                    node = node->left;
                else {
                    node->left = leaf;
                    leaf->parent = node;
                    break;
                }
            }
            else {
                if (node->right)
                    node = node->right;
                else {
                    node->right = leaf;
                    leaf->parent = node;
                    break;
                }
            }
        }
    insert_case1(leaf);
    root();
}
 
template <typename _ty> tree<_ty>* tree<_ty>::root() {
    tree* root = this->r;
    while (root->parent)
        root = root->parent;
    this->r = root;
    return root;
}
 
template <typename _ty> tree<_ty>* tree<_ty>::grandparent(tree<_ty>* node) {
    if (node->parent && node->parent->parent)
        return node->parent->parent;
    else
        return NULL;
}
 
template <typename _ty> tree<_ty>* tree<_ty>::uncle(tree<_ty>* node) {
    tree* g = grandparent();
    if (g == NULL)
        return NULL;
    if (g->left == node->parent)
        return g->right;
    else
        return g->left;
}
 
template <typename _ty> tree<_ty>* tree<_ty>::insert_case1(tree<_ty>* node) {
    if (!node->parent)
        node->color = BLACK;
    else
        insert_case2(node);
}
 
template <typename _ty> tree<_ty>* tree<_ty>::insert_case2(tree<_ty>* node) {
    if (!node->parent)
        return;
    else
        insert_case3(node);
}
 
template <typename _ty> tree<_ty>* tree<_ty>::insert_case3(tree<_ty>* node) {
    tree<_ty>* u = uncle(node), *g;
    if ((u != NULL) && (u->color == RED)) {
        node->parent->color = BLACK;
        u->color = BLACK;
        g = grandparent(node);
        g->color = RED;
        insert_case1(g);
    }
    else {
        insert_case4(node);
    }
}
 
template <typename _ty> tree<_ty>* tree<_ty>::insert_case4(tree<_ty>* node) {
    tree* g = grandparent(node);
 
    if ((node == node->parent->right) && (node->parent == g->left)) {
        rotate_left(node->parent);
        node = node->left;
    }
    else if ((node == node->parent->left) && (node->parent == g->right)) {
        rotate_right(node->parent);
        node = node->right;
    }
    insert_case5(node);
}
 
template <typename _ty> tree<_ty>* tree<_ty>::insert_case5(tree<_ty>* node) {
    tree* g = grandparent(node);
    node->parent->color = BLACK;
    g->color = RED;
    if ((node == node->parent->left) && (node->parent == g->left)) {
        rotate_right(g);
    }
    else {
        rotate_left(g);
    }
}
 
template <typename _ty> tree<_ty>* tree<_ty>::rotate_left(tree<_ty>* node) {
    tree* pivot = node->right;
 
    pivot->parent = node->parent;
    if (node->parent != NULL) {
        if (node->parent->left == node)
            node->parent->left = pivot;
        else
            node->parent->right = pivot;
    }
 
    node->right = pivot->left;
    if (pivot->left != NULL)
        pivot->left->parent = node;
 
    node->parent = pivot;
    pivot->left = node;
}
 
template <typename _ty> tree<_ty>* tree<_ty>::rotate_right(tree<_ty>* node) {
    tree* pivot = node->left;
 
    pivot->parent = node->parent;
    if (node->parent != NULL) {
        if (node->parent->left == node)
            node->parent->left = pivot;
        else
            node->parent->right = pivot;
    }
 
    node->left = pivot->right;
    if (pivot->right != NULL)
        pivot->right->parent = node;
 
    node->parent = pivot;
    pivot->right = node;
}
//main.cpp
--------------------
C++
1
2
3
4
5
#include "tree.h"
 
int main() {
    tree<int> t;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2019, 21:44
Ответы с готовыми решениями:

Ошибка при подключении заголовочного файла
Есть некий класс вот его заголовочный файл #include &lt;string&gt; class OSY { public: OSY();...

Ошибка при подключении заголовочного файла
Помогите найти ошибку #include &lt;conio.h&gt; #include &lt;graphics.h&gt; void triangle(int x,int y,int...

Ошибка при подключении заголовочного файла: "error LNK2019: unresolved external symbol"
Добрый день. Я что то не могу разобраться как работают эти заголовки на с++(вижуал студия). ...

Куча ошибок при подключении заголовочного файла
Вот только установил новую VS, создал проект, написал лишь #include &lt;iostream&gt; и тут... вылазит...

10
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
02.06.2019, 22:16 2
Попробуйте занести реализацию всех функций класса в h файл .
0
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 16
02.06.2019, 22:37  [ТС] 3
Я хочу научиться писать реализацию в отдельном файле
0
Эксперт С++
8422 / 3955 / 866
Регистрация: 15.11.2014
Сообщений: 8,907
03.06.2019, 00:17 4
Цитата Сообщение от keam Посмотреть сообщение
Я хочу научиться писать реализацию в отдельном файле
ты этого не хочешь.
просто ещё об этом не знаешь.
0
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
03.06.2019, 09:22 5
Цитата Сообщение от keam Посмотреть сообщение
Я хочу научиться писать реализацию в отдельном файле
Для шаблонов так делать нельзя. Не помню, можно ли выносить в cpp явную реализацию, надо смотреть в литературе
0
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 16
03.06.2019, 09:38  [ТС] 6
тогда как лучше сделать?
0
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
03.06.2019, 10:30 7
Цитата Сообщение от keam Посмотреть сообщение
тогда как лучше сделать?
Занести в .h и продолжить решать вашу задачу)
0
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 16
03.06.2019, 10:51  [ТС] 8
ну а если у меня задание в вузе сделать именно такую реализацию?
0
6613 / 4450 / 1807
Регистрация: 07.05.2019
Сообщений: 13,520
Записей в блоге: 1
03.06.2019, 10:57 9
Цитата Сообщение от keam Посмотреть сообщение
ну а если у меня задание в вузе сделать именно такую реализацию?
В любом случае, ты не можешь реализацию методов шаблонного класса делать в отдельном cpp-файле - либо в заголовке, либо в там, где ты их вызываешь.
В задании у тебя явно что-то другое.
0
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 16
03.06.2019, 11:18  [ТС] 10
Почему тогда, например, в queue или в deque используются шаблонные классы, если их нельзя использовать?
0
6613 / 4450 / 1807
Регистрация: 07.05.2019
Сообщений: 13,520
Записей в блоге: 1
03.06.2019, 11:20 11
Цитата Сообщение от keam Посмотреть сообщение
Почему тогда, например, в queue или в deque используются шаблонные классы, если их нельзя использовать?
Потому что там реализзация всех методов находится в заголовке, там же, где объявлен сам класс
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2019, 11:20

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

При подключении заголовочного файла появляются ошибки переопределения функций
Знаю, что эта тема размусолена, но попрошу немного добра. Пишу отдельный модуль с процедурами...

Ошибка при создании заголовочного файла
Добрый день. Недавно решил создать свой заголовочный файл, однако при компилятор выдает мне ошибку...

Ошибка при подключении файла Sales_item.h из примера в книге
Делаю маленькие шажки по книге &quot;C++ базовый курс 2014&quot; Скачал файл &quot;Sales_item.h.&quot;, добавил в...

Ошибка при подключении библиотеки graphics и файла ресурсов libbgi.lib
Собственно подключаю библиотеку и файл ресурсов к проекту, вроде бы подключается, но выдаёт ошибку...


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

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

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