Есть класс List и его наследник SList, в List есть вложенный класс iterator.
// List.h
template <class T> class List {
protected:
....
public:
class iterator;
List();
iterator end() {
return iterator(_pEnd->next);
}
iterator begin() {
return iterator(_pBegin);
}
class iterator {
protected:
ListNode<T> *pi;
public:
iterator() : pi(0) {}
iterator(ListNode<T>* _pi) : pi(_pi) {}
iterator(const iterator &it) : pi(it.pi) {}
iterator operator++() {
pi = pi->next;
return *this;
}
T& operator*() {
return pi->value;
}
bool operator!=(const iterator &it) {
return it.pi != pi;
}
iterator& operator=(const iterator &rhs) {
pi = rhs.pi;
return *this;
}
};
};
// SList.h
template <class T> class SList : public List<T> {
public:
class iterator : public List<T>::iterator {};
SList() : List<T>() {}
SList(int size) : List<T>(size) {}
SList(int size, T data) : List<T>(size, data) {}
iterator insert(T data) {
iterator it1, it2;
for(it1 = begin(); it1 != end(); ++it1) { // вот тут ругается
...
}
}
};
в int main создаю объект SList и больше ничего. Компилятор при сборке ругается:
SList.h: In member function ‘SList<T>::iterator SList<T>::insert(T)’:
SList.h:27: error: there are no arguments to ‘begin’ that depend on a template parameter, so a declaration of ‘begin’ must be available
SList.h:27: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
SList.h:27: error: there are no arguments to ‘end’ that depend on a template parameter, so a declaration of ‘end’ must be available
make: *** [SList.o] Ошибка 1