typedef aus Basisklasse nicht erkannt - Brett vorm Kopf?



  • Hallo zusammen,
    bei mir spuckt der Compiler Zähne, weil er einen typedef aus einer template-Basisklasse nicht findet. Vielleicht mache ich was falsch und seh den Wald vor lauter Bäumen nicht.
    folgender Code:

    #include <iterator>
    #include <boost/operators.hpp>
    #include <boost/type_traits/remove_pointer.hpp>
    // bei std::vector<T*>::iterator als iter_t ergibt sich value_t = T
    template<class iter_t, class value_t = typename boost::remove_pointer<
                                  typename std::iterator_traits<iter_t>::value_type
                                >::type > 
    class deref_iterator 
       // standard-typedefs und boilerplate fuer operatoren liefert boost.Operators
       : public boost::random_access_iterator_helper<deref_iterator<iter_t, value_t>, value_t, typename std::iterator_traits<iter_t>::difference_type>
    {
    public:
      reference operator*() const
      {/* ... */ }
    
    /* ... */
    };
    

    Der Clou ist der random_access_iterator_helper. Per base-Class chaining erbt das Ganze über mehrere Generationen von
    boost::iterator<std::random_access_iterator_tag, V, D, P, R> und damit von std::iterator<std::random_access_iterator_tag, V, D, P, R> , mit R = value_t& wie oben.
    Die Typen in der Hierarchie sind allesamt structs, die Vererbung des typedefs sollte also public bis in meine Klasse runterreichen.

    MSVC schmeißt mir aber folgenden Fehler und steigt danach aus:

    error C2143: syntax error : missing ';' before '*'
    

    , erkennt also reference nicht als typ.

    Ich hab auchs chon versucht, die basisklasse zu typedeffen und dann über den typedef qualifiziert den Typ anzugeben als base_t::reference operator*() const , dann meckert er, dass reference kein typ ist.

    Was stört ihn?



  • Mit dem gezeigten Code kann ich das nicht beurteilen, aber hast Du mal an boost.iterators gedacht? Ich könnte mir sogar denken, dass indirect_iterator schon das bereitstellt, was Du Dir da bauen willst (vermute ich aufgrund des Namens Deiner Klasse).



  • Wenn ich random_access_iterator_helper über http://www.tena-sda.org/doc/5.2.1/boost/d6/d66/operators_8hpp-source.html zurückverfolge, sehe ich nicht das es irgendwann in boost::iterator landet und somit reference bekommt. Vielleicht übersehe ich auch nur etwas.

    Abhilfe ist dann wohl nur ein eigenes:

    typedef value_t& reference;
    


  • KasF schrieb:

    Vielleicht übersehe ich auch nur etwas.

    Es erbt von random_access_iterable<T, P, D, R, boost::iterator<std::random_access_iterator_tag, V, D, P, R> >

    http://www.tena-sda.org/doc/5.2.1/boost/da/d1b/structboost_1_1random__access__iteratable.html

    Das letzte Argument, also boost::iterator, wird in der Hierarchie immer weiter nach oben gereicht, die oberste Klasse erbt dann davon.

    ich hab die typedefs jetzt manuell eingebaut (wovon mich der iterator_helper ja eigentlich befreien sollte).

    Tachyon: ja. Genau das Ding hab ich nachgebaut. *kopf->tisch*



  • Zur ursprünglichen Frage: reference ist als Rückgabewert deiner Funktion kein Dependent Name. Siehe http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 zur Lösung.



  • Michael E. schrieb:

    Zur ursprünglichen Frage: reference ist als Rückgabewert deiner Funktion kein Dependent Name. Siehe http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 zur Lösung.

    Ich wusste doch, das da noch irgendwas in diesem Zusammenhang war, aber pumuckl hatte das ja eigentlich mit seinem base typedef schon versucht. Vielleicht hat aber nur das typename gefehlt ...



  • meh. Das typename hat IIRC auch nichts gebracht. vermutlich weil das reference nicht in der dependent base sondern in der 5. oder 10. abhängigen Basisklasse ganz oben in der Hierarchie hängt -.-



  • pumuckl schrieb:

    meh. Das typename hat IIRC auch nichts gebracht. vermutlich weil das reference nicht in der dependent base sondern in der 5. oder 10. abhängigen Basisklasse ganz oben in der Hierarchie hängt -.-

    Komisch, das sollte eigentlich durchgehen: http://ideone.com/JPc2b





  • Michael E. schrieb:

    pumuckl schrieb:

    meh. Das typename hat IIRC auch nichts gebracht. vermutlich weil das reference nicht in der dependent base sondern in der 5. oder 10. abhängigen Basisklasse ganz oben in der Hierarchie hängt -.-

    Komisch, das sollte eigentlich durchgehen: http://ideone.com/JPc2b

    ja, da müsste ich nur durchschauen, wie das template am Ende der Klassenhierarchie dann aussieht. Du hast zum qualifizieren ja die oberste Klasse der Hierarchie angegeben, nicht die direkte Basisklasse.

    krümelkacker schrieb:

    So einen Iterator gibt es übrigens schon:
    http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/indirect_iterator.html

    So einen Kommentar gibts auch schon (oben von Tachyon) 😛


Log in to reply