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_base
    

    So 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 ptr pointer in der iterator_base (auch als protected ) 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! 🙂


Anmelden zum Antworten