3 / 3 / 1
Регистрация: 13.03.2011
Сообщений: 114
1

typename. Проблемы с вложенными шаблонными типами

26.02.2013, 23:25. Показов 611. Ответов 1
Метки нет (Все метки)

Здравствуйте.
Реализовываю шаблонный список.

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
/* 
* List.h
*/
#pragma once
 
#include <iostream>
using namespace std;
 
// List class defenition===============================================================================================
template<class T> class List
{
public:
    template<class T> class Elem
    {
    private:
        friend class List;
        T data;
        Elem<T> *next;
    public:
        Elem ()     { data = T(); next = NULL; };
        Elem (T t)  { data = t; next = NULL; };
    };
private:
    Elem<T> *first;
    Elem<T> *last;
public:
    List (){ first = NULL; last = NULL;};
    ~List ();
 
    inline Elem<T>* GetFirst () const { return first; };
    inline Elem<T>* GetLast ()  const { return last; };
    inline Elem<T>* GetNext (Elem<T>* e) const { return e->next; };
    inline T GetData (Elem<T> *e) const { return e->data; };
    inline bool IsEmpty () const { return first == NULL; }
    void Print(const char* separate = " ") const;
 
    int Add (T t);
    int Insert (T t, Elem<T> *e);
    Elem<T>* Find(T data) const;
    int RemoveNext (Elem<T> *e);
    int Remove (Elem<T> *e);
    int Remove (T data);
    inline void push_back (T t) { Insert(t, last); }
    inline void push_front (T t) { Add(t); }
    
 
    template<class T> class iterator
    {
    private: 
        Elem<T>* elem;
    public:
        iterator() { elem = NULL; }
        iterator(Elem<T>* e) { elem = e; }        
 
        iterator<T>& operator++ () { elem = elem->next; return *this; }
        bool operator == (iterator<T> it) { return elem == it.elem; }
        bool operator != (iterator<T> it) { return elem != it.elem; }
        T operator* (){return elem->data;}
    };
    iterator begin() const { return first; }
    iterator end()   const { return NULL; } // sheet
}; //===============================================================================================
 
 
template<class T>
List<T>::~List(){
    if(IsEmpty()) return;
 
    Elem *t = first;
 
    while(t) {
        Elem *tmp = t->next;
        delete(t);
        t = tmp;
    }
};
 
template<class T>
int List<T>::Add(T t) {
    Elem *pe = new Elem<T>(t);
    if(!pe) {
        cerr << "Memory error!";
        return 1;
    }
    
    if(IsEmpty())  
        first = last = pe;
    else {
        pe->next = first;
        first = pe;
    }
 
    return 0;
}
 
template<class T>
int List<T>::Insert(T t, Elem<T>* e) {
    Elem *pe = new Elem(t);
    if(!pe) {
        cerr << "Memory error!";
        return 1;
    } 
 
    if(IsEmpty())  
        first = last = pe;
    else {
        pe->next = e->next;
        e->next = pe;
 
        if(e == last) last = pe;
    }
 
    return 0;
}
 
template<class T>
List<T>::Elem<T>* List::Find(T data) const {
    Elem<T>* cur = GetFirst();
 
    while(cur != NULL) {
        if(cur->data == data) break;
        cur = cur->next;
    }
 
    return cur;
}
 
template<class T>
int List<T>::RemoveNext(Elem<T>* e) {
    if(IsEmpty() || e == last) return 1;
 
    Elem* tmp = e->next;
    e->next = e->next->next;
    delete tmp;
    return 0;
}
 
//do not Removes last element
template<class T>
int List<T>::Remove(Elem<T>* e) {
    if(IsEmpty()) return 1;
    if(e == NULL) return 2;
 
    Elem<T>* tmp = e->next;
    e->data = e->next->data;
    e->next= e->next->next;
    delete tmp;
    return 0;
}
 
template<class T>
int List<T>::Remove(T data) {
    Elem<T>* tmp = Find(data);
    return Remove(tmp);
}
 
template<class T>
void List<T>::Print(const char* separate) const {
    List::iterator<T> cur;
    for(cur = this->begin(); cur != this->end(); ++cur) {
        cout << *cur;
        cout << separate;
    }
}
Проблема одна:
в строке 116 - 117 возращаемое значение метода - шаблонный класс Elem<T>, определённый внутри шаблонного класса List<T>.

Вот что выдаёт компилятор:

c:\users\user\desktop\projects\console_trash\conso le_trash\list.h(117): warning C4346: List<T>::?$Elem@$RT@BAAB@: зависимое имя не является типом
1> укажите префикс "typename" для задания типа
1>c:\users\user\desktop\projects\console_trash\con sole_trash\list.h(117): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1>c:\users\user\desktop\projects\console_trash\con sole_trash\list.h(117): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\user\desktop\projects\console_trash\con sole_trash\list.h(117): error C2936: List<T>::Elem<T>: идентификатор класса шаблона переопределен как глобальная переменная данных
1>c:\users\user\desktop\projects\console_trash\con sole_trash\list.h(117): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции


Полазил по сети поискал о typename - и ничего итого не нашёл.
Что нужно сделать, чтобы класс Elem был виден "нормально".
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2013, 23:25
Ответы с готовыми решениями:

Оператор сравнения между шаблонными типами
Осваиваю c#, адаптирую код из c++: есть класс на шаблоне, внутри него элемент типа шаблона,...

Шаблонная-функция, проблемы с типами
Смысл в том что мне нужно написать шаблон который будет принимать вектор любого типа удалять дубли...

Проблемы с типами данных и сохранение их
После замены в коде скрипта через регулярное выражение скрипт сохраняется в интересном виде в чем...

Проблемы с типами данных в Delphi
Пожалуйста подымите это: s:=s+inttostr(int(exp(ln(ord(x)*strtoint(s4))) mod strtoint(s3)); ...

1
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
26.02.2013, 23:29 2
C++
1
2
template<class T>
typename List<T>::Elem<T>* List<T>::Find(T data) const {
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2013, 23:29
Помогаю со студенческими работами здесь

Олимпиадная задача: проблемы с типами данных
Доброго времени суток. Совсем недавно стал переходить с бейсика на паскаль, и вот в процессе...

Объясните, пожалуйста в чем разница между типами-значениями и ссылочными типами?
В чем разница между типами-значениями и ссылочными типами. Привести пример типов-значений и...

Как самому установить соответствие между типами API функции в MSDN и типами VB
Как самому установить соответствие между типами данных, приведенных на API функции в MSDN и типами...

Не получается сделать 3 класса шаблонными.
Есть три класса + функция main, в которой используются эти классы. Все работает. Сделал эти три...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru