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

Ссылка на не разрешнный внешний символ - C++

Восстановить пароль Регистрация
 
Yentroistok
1 / 1 / 0
Регистрация: 25.02.2012
Сообщений: 59
03.07.2012, 11:58     Ссылка на не разрешнный внешний символ #1
Есть три модуля программы, если собрать их в один-два модуля то все работает. Если же еще и методы отдельно в модуль загнать, то вылезают ошибки:
C++
1
2
3
4
5
Ошибка  5   error LNK1120: 3 неразрешенных внешних элементов    C:\Users\ссс\Desktop\Project!!!!\Derevo\Debug\Derevo.exe    1
Ошибка  4   error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall BinaryTree<int>::addChild(int)" (?addChild@?$BinaryTree@H@@QAEXH@Z) в функции _main  C:\Users\ссс\Desktop\Project!!!!\Derevo\Derevo\Tree.obj
Ошибка  2   error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall BinaryTree<int>::del(int)" (?del@?$BinaryTree@H@@QAEXH@Z) в функции _main    C:\Users\ссс\Desktop\Project!!!!\Derevo\Derevo\Tree.obj
Ошибка  3   error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall BinaryTree<int>::print(struct BinaryTree<int>::Node *,int)" (?print@?$BinaryTree@H@@QAEXPAUNode@1@H@Z) в функции _main   C:\Users\ссс\Desktop\Project!!!!\Derevo\Derevo\Tree.obj
Предупреждение  1   warning C4101: c: неиспользованная локальная переменная c:\users\ссс\desktop\project!!!!\derevo\derevo\tree.cpp 12
Как это исправить?

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
#pragma once //страж включения
 
template <typename Type>
class BinaryTree
{
    struct Node
    {
        Type value;
        Node *L, *R;        // L - левая ветка; R - правая ветка
        Node(Type v, Node *left = NULL, Node *right = NULL):value(v), L(left), R(right) {}
    };
 
    Node *root;  // Родитель
    
    void AddLR(Node* &r, Type v)    // 
    {
        if (!r)
           r = new Node(v,0,0);
        else
           if(v < r->value)
                AddLR(r->L, v);
           else
                AddLR(r->R, v);
    }
   
bool findRec(Node* r, Type v)           // поиск
    {
       if (!r) 
          return false;
       else 
          if (v == r->value)
          {
             return true;
          }
          else 
             if (v < r->value)
             {
                return findRec(r->L, v);
             }
             else
             {
                return findRec(r->R, v);
             }
    }
 
public:
    BinaryTree(Node *r = 0):root(r){}
    ~BinaryTree();    // деструктор
    void addChild(Type v);
    void del(Type d);
    void print(Node *root1, int Length);
    bool find(Type v);
    Node *Get_Element()
        {
            return root;
        }
 
private:
     void DelElement(Node* &r, Type dv)           // удаление
    {
        Node *EL_T, *v;
        if (!r) 
            cout << "Элемент '"<< dv <<"' не найден!" << endl;        // если введен не существующий в дереве эл-т
        else    // если эл-т существует, то
            if (dv < r->value) 
                DelElement(r->L, dv);
            else 
                if (dv > r->value) 
                    DelElement(r->R, dv);
                   else 
                    {
                        EL_T = r;
                        if (!r->R) 
                            r = r->L;
                        else 
                            if (!r->L) 
                                r = r->R;
                            else
                                {
                                    v = r->L;
                                    if (v->R)
                                    {
                                         while (v->R->R) v = v->R; 
                                           r->value = v->R->value;
                                         EL_T = v->R; 
                                         v->R = v->R->L;
                                    }
                                    else
                                    {
                                         r->value = v->value;
                                         EL_T = v;
                                         r->L=r->L->L;
                                    }
                                }
                        delete EL_T;      // очищаем эл-т(память)
                    }
    }
};
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
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include "Methods fo tree.h"
 
template <typename Type>
void BinaryTree<Type>::addChild(Type v)       // добавляем детей
{ 
    AddLR(root, v);    
}
//--------------------------------------------------------------------------------------------------------------------------
template <typename Type>
void BinaryTree<Type>::del(Type v) 
{ 
    DelElement(root, v);    
}
//--------------------------------------------------------------------------------------------------------------------------
template <typename Type>
void BinaryTree<Type>::print(Node *root1, int Length)
{
  if (root1)  // если значение TRUE, т.е. root1 =! NULL
 {
    print(root1->L, Length + 1);       // вывод левого поддерева
        for(int i = 0; i < Length; i++) 
            {
                cout << "-----";
            }
        cout << "Уровень: " << Length << "; Элемент = "; cout << root1->value << endl;
        //cout<< tree->value<< endl;       // вывод корня подерева
        print(root1->R, Length + 1);               // вывод левого поддерева
  } 
}
//--------------------------------------------------------------------------------------------------------------------------
template <typename Type>
bool BinaryTree<Type>::find(Type v)
{
    return findRec(root, v);
}
//--------------------------------------------------------------------------------------------------------------------------
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>
#include <stdio.h>
#include <conio.h>
#include "Methods fo tree.h"
#include <stdlib.h>
 
using namespace std;        // для Работы cin, cout, endl
 
int main()
{
    setlocale (LC_ALL, "Russian");
    int n,a,b,c;
    BinaryTree<int> *Type = new BinaryTree<int>();
    
    cout << "Введите кол-во эл-тов в дереве: ";
    cin >> n;
    while (--n > -1) // добавляем эл-ты в дерево
    {     cin >> a;
          Type->addChild(a);    
    }
    cout << "Дерево содержит следующие эл-ты" << endl;
    Type->print(Type->Get_Element(), n+1);  // выводим дерево на экран
    
    cout << "\nВведите эл-т который хотите удалить"<< endl;
    cin >> b; 
    Type->del(b); // удаляем эл-т
    
    cout << "Вывод дерева без удаленного эл-та" << endl;
    Type->print(Type->Get_Element(), n+1);    // выводим получившееся дерево на экран
    
    _getch();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2012, 12:16     Ссылка на не разрешнный внешний символ #2
Шаблон и реализация в одном файле должны быть.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.07.2012, 12:16     Ссылка на не разрешнный внешний символ #3
Yentroistok, реализации шаблонных функций должны быть в каждом файле, где они вызываются.
Yentroistok
1 / 1 / 0
Регистрация: 25.02.2012
Сообщений: 59
03.07.2012, 12:25  [ТС]     Ссылка на не разрешнный внешний символ #4
soon, То есть реальзованные методы, перетащить в *.h файл?

Добавлено через 5 минут
Все решил проблему сделав так:
C++
1
#include "methods for tree.cpp"
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.07.2012, 12:32     Ссылка на не разрешнный внешний символ #5
Yentroistok, в подобных случаях я либо делаю реализацию в заголовочном файле, либо раскидываю по hpp и ipp, которые включаю в один общий хидер, а эти прячу подальше, чтобы не мешались.
Но явно подключать cpp - плохой стиль.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2012, 12:32     Ссылка на не разрешнный внешний символ #6
Цитата Сообщение от Yentroistok Посмотреть сообщение
Как это исправить?
Шаблон и реализацию шаблона в заголовочный. Заголовочный #include в тот, где main().
Yandex
Объявления
03.07.2012, 12:32     Ссылка на не разрешнный внешний символ
Ответ Создать тему
Опции темы

Текущее время: 15:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru