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

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

Войти
Регистрация
Восстановить пароль
 
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
#1

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

26.02.2013, 23:25. Просмотров 300. Ответов 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 был виден "нормально".
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 23:25     typename. Проблемы с вложенными шаблонными типами
Посмотрите здесь:
C++ Не работает программа с шаблонными функциями
Не получается сделать 3 класса шаблонными. C++
C++ Создать единый класс с шаблонными векторами
C++ Оператор typename
C++ Typename и Class
C++ Template<typename T> vs auto
шаблоны и typename в частности C++
Typename в шаблонах класса C++
C++ Typename перед инстанцированием
Visual c++ шаблон template <typename TT> C++
C++ Что означает using typename в шаблоне?
C++ Для чего нужен шаблон <typename T>

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
26.02.2013, 23:29     typename. Проблемы с вложенными шаблонными типами #2
C++
1
2
template<class T>
typename List<T>::Elem<T>* List<T>::Find(T data) const {
Yandex
Объявления
26.02.2013, 23:29     typename. Проблемы с вложенными шаблонными типами
Ответ Создать тему
Опции темы

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