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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Penoplast
3 / 3 / 1
Регистрация: 14.09.2012
Сообщений: 84
#1

Template - C++

15.09.2012, 17:50. Просмотров 543. Ответов 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 неразрешенных внешних элементов

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

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier - C++
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

'MyQueue' : use of class template requires template argument list - C++
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

В чем различие template <typename T> от template <class T> ? - C++
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Ошибка компиляции: template-id does not match any template declaration - C++
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...

Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает - C++
Проект содержит три файла: Source.cpp, arrTreat.h, arrTreat.cpp. Source.cpp: #include &lt;iostream&gt; using std::cout; using...

MSVC и template template classes - C++
Приветствую. Как в MSVC передать template template класс? Простой пример template&lt;template&lt;typename, typename&gt; class Return&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
15.09.2012, 18:07 #2
Penoplast, В общем случае нельзя разносить декларацию и определение шаблонов на .h и .cpp файлы. Определяйте все в .h и прежде чем создать тему - используйте поиск.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2012, 18:07
Привет! Вот еще темы с ответами:

Friend template class with template class argument - C++
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

Не пойму конструкцию template <template <class T> class X> - C++
Что это за шаблон такой?

template - C++
#include &lt;iostream&gt; #include &lt;string&gt; template &lt;class T, class S&gt; void foo(const T&amp; a, const S&amp; b) { ...

Template - C++
Доброго всем времени суток. Скажите, если я написал в хидере класса template &lt;typename T&gt; class matrix { //------- } что...


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

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

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