iteratoren in funktionstemplates



  • hi. wollte mit grad folgendes template schreiben (vereinfacht) :

    template<typename T>
    void fun(const std::vector<T>& v, T b)
    {
    typename std::vector<T>::const_iterator iter_t; //Typanmeldung funktioniert
    iter_t i = v.begin(); // Instanziierung dieses Typs funktioniert nicht
    ...
    }

    Woran liegt das?



  • void fun(const std::vector<T>& v, T b) 
        { 
        typename std::vector<T>::const_iterator iter_t;
        iter_t=v.begin();
        ...
        }
    


  • hab's zeitgleich eben rausgekriegt.
    trotzdem dankeschön.

    aber wieso wird mit der typendeklaration gleichzeitig der iterator angelegt?
    versteh ich irgendwie nicht...



  • Du verwechselst bestimmt typename mit typedef. typename wird nur benutzt wenn man auf Elemente von nem Template-Type zugreifen möchte, was hier der fall ist. Mit typedef erzeiugt man eigene "Pseudeo-"Typen:

    /*
       * Zugriff auf ein Element (const_iterator) vom Template-Type (std::vector < T >)
       */
      typename std::vector<T>::const_iterator iter_t;
    
      /*
       * Mit typedef einen Pseudo-Type erzeugt.
       */
      typedef typename std::vector<T>::const_iterator iter_t;
      iter_t it; //Ergibt dasselbe wie beim ersten "Fall".
    


  • Konrad schrieb:

    Du verwechselst bestimmt typename mit typedef. typename wird nur benutzt wenn man auf Elemente von nem Template-Type zugreifen möchte, was hier der fall ist. Mit typedef erzeiugt man eigene "Pseudeo-"Typen:

    /*
       * Zugriff auf ein Element (const_iterator) vom Template-Type (std::vector < T >)
       */
      typename std::vector<T>::const_iterator iter_t;
    
      /*
       * Mit typedef einen Pseudo-Type erzeugt.
       */
      typedef typename std::vector<T>::const_iterator iter_t;
      iter_t it; //Ergibt dasselbe wie beim ersten "Fall".
    

    afaik wird der 2 fall aber nichts.



  • Cpt.Tanga schrieb:

    Konrad schrieb:

    Du verwechselst bestimmt typename mit typedef. typename wird nur benutzt wenn man auf Elemente von nem Template-Type zugreifen möchte, was hier der fall ist. Mit typedef erzeiugt man eigene "Pseudeo-"Typen:

    /*
       * Zugriff auf ein Element (const_iterator) vom Template-Type (std::vector < T >)
       */
      typename std::vector<T>::const_iterator iter_t;
    
      /*
       * Mit typedef einen Pseudo-Type erzeugt.
       */
      typedef typename std::vector<T>::const_iterator iter_t;
      iter_t it; //Ergibt dasselbe wie beim ersten "Fall".
    

    afaik wird der 2 fall aber nichts.

    Warum sollte denn das typedef nicht möglich sein ?
    Also afaik ist es doch nen normales /legales typedef.?



  • shapeless schrieb:

    Cpt.Tanga schrieb:

    Konrad schrieb:

    Du verwechselst bestimmt typename mit typedef. typename wird nur benutzt wenn man auf Elemente von nem Template-Type zugreifen möchte, was hier der fall ist. Mit typedef erzeiugt man eigene "Pseudeo-"Typen:

    /*
       * Zugriff auf ein Element (const_iterator) vom Template-Type (std::vector < T >)
       */
      typename std::vector<T>::const_iterator iter_t;
    
      /*
       * Mit typedef einen Pseudo-Type erzeugt.
       */
      typedef typename std::vector<T>::const_iterator iter_t;
      iter_t it; //Ergibt dasselbe wie beim ersten "Fall".
    

    afaik wird der 2 fall aber nichts.

    Warum sollte denn das typedef nicht möglich sein ?
    Also afaik ist es doch nen normales /legales typedef.?

    irrtum meinerseits wuerde ich sagen. hatte noch in tiefer erinnerung was davon haengen wie typedef typename T::bla.... waere (noch) nicht legaler code. ka woher ich das hatte. aber wie ja auch an deiner signatur zu sehen ist scheine ich mich ja zu irren 🙂 :p


Anmelden zum Antworten