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

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

Восстановить пароль Регистрация
 
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
26.02.2013, 23:25     typename. Проблемы с вложенными шаблонными типами #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. Проблемы с вложенными шаблонными типами
Посмотрите здесь:

шаблоны и typename в частности C++
Не получается сделать 3 класса шаблонными. C++
C++ Typename и Class
C++ Для чего нужен шаблон <typename T>
C++ Оператор typename
C++ Шаблоны. Что лучше <class T> или <typename T>?
C++ Создать единый класс с шаблонными векторами
C++ Template<typename T> vs auto

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 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. Проблемы с вложенными шаблонными типами
Ответ Создать тему
Опции темы

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