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

Template - C++

Войти
Регистрация
Восстановить пароль
 
Penoplast
3 / 3 / 1
Регистрация: 14.09.2012
Сообщений: 84
15.09.2012, 17:50     Template #1
Пишу на VS10.

Имеется 3 файла:

List.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
#ifndef LIST_H
#define LIST_H  
 
//DEList
 
 
template <class DataType>
class List
{
    class Item
    {
    public:
        DataType data;
        Item *prev;
        Item *next;
 
        Item () {prev = 0; next = 0;}
    };
 
    Item *pHead;
    Item *pTail;
 
public:
    List  ();
    ~List ();
 
    void push_front (DataType type);
    void push_back  (DataType type);
 
    inline DataType front () {return pHead->data;}
    inline DataType back  () {return pTail->data;}
 
    DataType delete_front (int count = 1);
    DataType delete_back  (int count = 1);
};
 
 
 
#endif


List.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
#include "List.h"
 
template <class DataType>
List<DataType>::List()
{
    pHead = 0;
    pTail = 0;  
};
 
 
template <class DataType>
List<DataType>::~List()
{
    if (pHead != 0)
    {
        while (pHead != pTail)
        {
            pHead = pHead->prev;
            delete (pHead->next);
        }
        delete (pHead);     
    }   
};
 
 
template <class DataType>
void List<DataType>::push_front (DataType Type)
{
    if (pHead == 0)
    {
        Item *pTemp;
        pTemp = new (Item);
        pTemp->data = Type;
        pTemp->next = 0;
        pTemp->prev = 0;
        pHead = pTail = pTemp;
    }
    else
    {
        Item *pTemp;
        pTemp = new (Item);
        pTemp->data = Type;
        pTemp->prev = pHead;
        pHead->next = pTemp;
        pHead = pTemp;
    }
};
 
template <class DataType>
void List<DataType>::push_back (DataType Type)
{
    if (pTail == 0)
    {
        Item *pTemp;
        pTemp = new (Item);
        pTemp->data = Type;
        pTemp->next = 0;
        pTemp->prev = 0;
        pHead = pTail = pTemp;
    }
    else
    {
        Item *pTemp;
        pTemp = new (Item);
        pTemp->data = Type;
        pTemp->next = pTail;
        pTail->prev = pTemp;
        pTail = pTemp;
    }
};
 
template <class DataType>
DataType List<DataType>::delete_front (int count)
    //count default = 1
    //return:
    //0 - it's OKAY
    //1 - List is Empty
{
    if (pHead != 0)
    {
        while ((count != 0) && (pHead != pTail))
        {
            pHead = pHead->prev;
            delete (pHead->next);
            --count;
        }
 
        if ((count != 0) && (pHead == pTail))
        {
            delete (pHead);
            pHead = pTail = 0;
            return 1;
        }
    }
    else
        return 1;
 
    return 0;
}
 
template <class DataType>
DataType List<DataType>::delete_back (int count)
    //count default = 1
    //return:
    //0 - it's OKAY
    //1 - List is Empty
{
    if (pTail != 0)
    {
        while ((count != 0) && (pHead != pTail))
        {
            pTail = pTail->next;
            delete (pTail->prev);
            --count;
        }
 
        if ((count != 0) && (pHead == pTail))
        {
            delete (pTail);
            pHead = pTail = 0;
            return 1;
        }
    }
    else
        return 1;
 
    return 0;
}


main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "List.h"
#include <iostream>
 
int main(/*int argc, const char *argv[]*/)
{
    List<int> lst;
    lst.push_front(2);
    lst.push_front(4);
    lst.push_front(1);
    lst.push_front(87);
    lst.push_back(619);
    lst.delete_front();
    lst.delete_front(70);
    lst.push_back(55);
 
    return 0;
}
Далее, при попытке собрать это, линкер ругается:

main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall List<int>::~List<int>(void)" (??1?$List@H@@QAE@XZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall List<int>::delete_front(int)" (?delete_front@?$List@H@@QAEHH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall List<int>:ush_back(int)" (?push_back@?$List@H@@QAEXH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall List<int>:ush_front(int)" (?push_front@?$List@H@@QAEXH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall List<int>::List<int>(void)" (??0?$List@H@@QAE@XZ) в функции _main
1>D:\Projects\OOP_list\Debug\OOP_list.exe : fatal error LNK1120: 5 неразрешенных внешних элементов

Если не использовать шаблоны то все ок, но без них не вариант.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2012, 17:50     Template
Посмотрите здесь:

C++ template
Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier C++
Template C++
C++ MSVC и template template classes
C++ template и using
C++ Не пойму конструкцию template <template <class T> class X>
Ошибка компиляции: template-id does not match any template declaration C++
Template C++
'MyQueue' : use of class template requires template argument list C++
C++ Template и Классы
C++ В чем различие template <typename T> от template <class T> ?
String в template C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.09.2012, 18:07     Template #2
Penoplast, В общем случае нельзя разносить декларацию и определение шаблонов на .h и .cpp файлы. Определяйте все в .h и прежде чем создать тему - используйте поиск.
Yandex
Объявления
15.09.2012, 18:07     Template
Ответ Создать тему
Опции темы

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