Hmm that's good advice. I can't seem to get it to compile though. Here's the original set of code template <typename T> class SelfOrganizingList: public list<T> { public: bool contains(const T& t) { typename list<T>::iterator it = find(this->begin(), this->end(), t); if (it == this->end()) return false; if (it != this->begin()) { erase(it); push_front(t); } return true; } }; Using your advice, I changed the typename list code(line 7) to typedef list<T> super; using super::size; using super::empty; typedef typename super::iterator it; However it says that super is not a namespace (strlist.cpp:14: error: ‘SelfOrganizingList<T>::contains(const T&)::super’ is not a namespace) Any advice regarding this issue? I'm basically looking for a more elegant way of implementing this other than using this->begin(); because that seems a bit contradictory to the actual reason for the existence of the -> object. Thanks guys, Tyler John Fine wrote: > Tyler Earman wrote: >> "I have noticed that when (this is C++) inheriting a templatized derived >> class from a templatized base that in g++, references to elements of the >> base class have to be qualified with this-> or with the name of the base >> class put in front. But this is NOT needed in the Windows C++ compilers >> so far as I can see. > GCC is doing the correct thing according to the C++ standard. I > personally think the C++ standard is bad and this feature makes C++ a > worse language than it was before compilers enforced this language > behavior. > > When coding to work around this problem, I find both this->name and > base_class::name are ugly constructs. I don't use either to work > around this problem. Instead I use using directives, such as: > > template <class X> > class my_container : public std::vector<X> > { > typedef std::vector<X> super; > using super::size; > using super::empty; > typedef typename super::iterator iterator; > > At the start of most classes, I typedef the major base class as > "super" (not directly relevant to the current issue, but it helps). > Then I have the appropriate using super:: declarations to identify all > the function and variable names from that super class which will be > used bare in the current class. You can't use using declarations for > types from the base class, so those are best done with the typedef > typename construct. > > >