hilfe gcc will nicht so wie visual2003



  • hallo, hoffe koennt helfen:

    fuer eine template klasse vom typ:

    template<class T>
    class CQuickCounter : public map<T, U64>
    {
      typedef typename CQuickCounter<T>::const_iterator CQuickCounterIterator;
      void Print()
      {
         CQuickCounterIterator it = begin();   
      }
    };
    

    gcc meckert hier mit:
    'there are no arguments to 'begin' that depend on a template parameter .. (etc.)'

    habe stattdessen mal CQuickCounter<T>::begin() versucht.
    schluckt gcc dann auch.

    aber laestig das man dies vor alles schreiben muss, was von map geerbt wurde.
    da steht doch eigentlich schon ein Template-Parameter ueber der klassendeklaration, warum also nochmal, und wie loest man obiges eleganter !?!?

    danke.



  • hola

    was willst du mit

    typedef typename CQuickCounter<T>::const_iterator CQuickCounterIterator;
    

    machen/bezwecken ?

    wenn du das wilst was ich glaube das du willst, dann mach es mal so:

    template<class T>
    class CQuickCounter : public std::map<T, U64>
    {
      typedef std::map<T, U64> map;
      typedef map::const_iterator CQuickCounterIterator;
      //typedef CQuickCounter<T>::const_iterator CQuickCounterIterator;
      void Print()
      {
         CQuickCounterIterator it = begin();
      }
    };
    

    Meep Meep



  • > aber laestig das man dies vor alles schreiben muss, was von map geerbt wurde.

    Deshalb erbt man auch niemals öffentlich von STL-Containern. Die sind dafür nicht konzipiert. Es fehlen u.a. auch virtuelle Funktionen, besonders der Destruktor. Nutze Komposition oder private Vererbung!


  • Mod

    Der gcc hält sich hier streng an den Standard, das kannst du ihm nicht vorwerfen. Du kannst aber this.begin() verwenden können, wenn du weniger Schreibarbeit haben möchtest. Oder wie dir der gcc mit der Fehlermeldung mitgeteilt haben dürfte, kannst du den Schalter -fpermissive benutzen.



  • Die Containerklassen der STL sind nicht dazu gedacht von ihnen abzuleiten. Benutze lieber Aggregation.



  • Ad aCTa schrieb:

    Es fehlen u.a. auch virtuelle Funktionen, besonders der Destruktor. Nutze Komposition oder private Vererbung!

    Stört das eigentlich, solange man nicht gerade

    map<string, U64> *abc = new CQuickCounter<string>();
    

    schreibt?



  • wxSkip schrieb:

    Ad aCTa schrieb:

    Es fehlen u.a. auch virtuelle Funktionen, besonders der Destruktor. Nutze Komposition oder private Vererbung!

    Stört das eigentlich, solange man nicht gerade

    map<string, U64> *abc = new CQuickCounter<string>();
    

    schreibt?

    [/quote]
    Nein. Es gibt Gründe warum man von Value-Typen wie eben zB map einer ist, erben will. Aber vorsicht ist geboten. Denn man darf den Typen dann nicht polymorph verwenden und das ist programmiertechnisch nicht verbietbar.



  • also wieso man von STL containern auf die art wie beschrieben nicht ableiten sollte verstehe ich nicht, bzw. ist doch eleganter als es ueber eine aggregations beziehung machen zu muessen. hoert sich jedenfalls eher nach ner notloesung an.

    das mit dem this pointer vor dem begin() geht ebenfalls nicht (gleiche fehlermeldung)

    @Meep Meep: was ist da der unterschied (gibt doch keinen in bezug auf deinen vorschlag fuer den iterator ?!)

    darueber hinaus wundert es mich das obige fehlermeldung in bezug auf begin()
    ebenfalls beim gcc kommt wenn ich innerhalb von Print()

    die funktion resetioflags(..) (kommt aus iomanip.h)
    benutzen moechte.

    warum 😕 !?



  • pepe75 schrieb:

    also wieso man von STL containern auf die art wie beschrieben nicht ableiten sollte verstehe ich nicht, bzw. ist doch eleganter als es ueber eine aggregations beziehung machen zu muessen. hoert sich jedenfalls eher nach ner notloesung an.

    Weil du keine polymorphe verwendung haben kannst.

    Deshalb sagt man: darf man nicht.
    Denn man muss die Gefahren kennen wenn man so eine Vererbung haben will.

    Du darfst zB abgeleitete Typen nicht über einen Basisklassen Zeiger löschen. Du musst enorm auf slicing aufpassen und du hast kein polymorphes verhalten.

    Meistens ist aggregation sinnvoller, da du eine Menge Probleme einfach umgehst.



  • nur damit ich es richtig verstehe,
    also waere das folgende angebrachter ? -->>

    template<class T>
    class CQuickCounter 
    {
      typedef typename map<T,U64> CQuickCounterIterator;
      void Print()
      {
         CQuickCounterIterator it = m_map.begin();  
      }
      private:
        map<T,U64> m_map;
    };
    

    vielen dank.



  • pepe75 schrieb:

    nur damit ich es richtig verstehe,
    also waere das folgende angebrachter ? -->>

    template<class T>
    class CQuickCounter 
    {
      typedef typename map<T,U64> CQuickCounterIterator;
      void Print()
      {
         CQuickCounterIterator it = m_map.begin();  
      }
      private:
        map<T,U64> m_map;
    };
    

    vielen dank.

    Ja, mit dem Nachteil, dass du jetzt die Map-Funktionen außerhalb deiner Klasse nicht mehr verwenden kannst.



  • ich nochmal 😞

    ich bekomme gleiche fehlermeldung wie aus meinem ersten post,
    falls ich folgendes mache (und hier ist eigentlich nix mit vererbung krumm
    dachte ich !?!?) -->

    template<class T>
    class CQuickCounter
    {
      typedef typename map<T,U64> CQuickCounterIterator;
      void Print( ofstream &outFile )
      {
     for(it=m_map.begin(); it!=m_map.end(); it++)
          {
            T cntName     = (*it).first;
            U64 cntValue  = (*it).second;
    
            outFile << resetiosflags(ios::adjustfield) << setiosflags(ios::left) << setw(PRINT_WIDTH); 
            outFile << cntName << " " << cntValue << endl;
          }
      }
      private:
        map<T,U64> m_map;
    };
    

    wieder mit gleicher fehlermeldung:
    there are no arguments to 'resetioflags' that depend on a template parameter, so a declaration of 'resetioflags' must be available 😕

    (die entsprechenden header-includes fuer std::xxx sind im originalcode natuerlich vorhanden).

    vielen dank.


Anmelden zum Antworten