Abgeleitete Klasse erkennt protected Eigenschaft von Basisklasse nicht
-
Hi!
Habe vor ner Halben Stunde lust gehabt, es (mal wieder wohlbemerkt) mit einer Liste zu versuchen. Bin dann nach einer Weile auf folgendes Problem gestoßen:
template<typename type, typename allocator_t> class list<type, allocator_t>::iterator_base : public std::iterator<std::bidirectional_iterator_tag, type, std::ptrdiff_t, typename list<type>::pointer, typename list<type>::reference> { protected: node* ptr; //...So sieht meine iterator_base aus, jetzt gehe ich einen Schritt weiter und
template<typename type, typename allocator_t> struct list<type, allocator_t>::iterator : public iterator_baseSo sieht der Vordere Teil meines Iterators aus. Jetzt, im (Präfix-)Inkrement Operator kommt folgende Fehlermeldung:
iterator& operator++() { ptr = ptr->next;//(wie sehr offensichtlich) HIER return *this; }C:\...\LISTE.hxx|153|Fehler: »ptr« wurde in diesem Gültigkeitsbereich nicht definiert|
Obwohl ich ja (ganz eindeutig) den
ptrpointer in der iterator_base (auch alsprotected) deklariert habe.
Was ist da falsch?
-
Ah. Das steckt tief in den Lookup-Regeln für dependent names in Templates. Du hast da eine Klassenvorlage, die von einer Klassenvorlage erbt, und wenn er die erbende Template parst, kann er noch keine Aussage darüber treffen, welche Member die geerbte Template haben wird, wenn die erbende Template zu einer Klasse konkretisiert wird (weil sie später spezialisiert werden könnte).
Die einfachste Lösung ist, in iterator irgendwo
using iterator_base::ptr;zu schreiben.
-
seldon schrieb:
Ah. Das steckt tief in den Lookup-Regeln für dependent names in Templates. Du hast da eine Klassenvorlage, die von einer Klassenvorlage erbt, und wenn er die erbende Template parst, kann er noch keine Aussage darüber treffen, welche Member die geerbte Template haben wird, wenn die erbende Template zu einer Klasse konkretisiert wird (weil sie später spezialisiert werden könnte).
Die einfachste Lösung ist, in iterator irgendwo
using iterator_base::ptr;zu schreiben.
Unglaublich wie schlau du bist. Vielen Dank!
