Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
unkarjedy
3 / 3 / 1
Регистрация: 13.03.2011
Сообщений: 114
#1

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

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


Полазил по сети поискал о typename - и ничего итого не нашёл.
Что нужно сделать, чтобы класс Elem был виден "нормально".
http://www.cyberforum.ru/cpp-beginners/thread1866744.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 23:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос typename. Проблемы с вложенными шаблонными типами (C++):

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

Создать единый класс с шаблонными векторами
Здравствуйте, уважаемые. Возник 1 вопрос при написании шаблонного класса: как...

Typename и Class
Между записью template &lt;class T&gt; и template &lt;typename T&gt; нет никакой разницы?

Оператор typename
Здравствуйте. Делал недавно небольшую программку и столкнулся с одной...

Template<typename T> vs auto
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница...

1
Croessmah
++Ͻ
14149 / 8074 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 23:29
Привет! Вот еще темы с решениями:

Typename в шаблонах класса
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class...

шаблоны и typename в частности
Здравствуйте! Я разбираюсь с ассоциативными контейнерами в с++ - делаю...

Typename перед инстанцированием
В каких случаях перед созданием объекта надо писать typename... И зачем оно там...

Зависимые имена и typename
Не пойму логику зависимых имён. может кто подскажет. вот есть такой пример: ...


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

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

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