friends und Templates



  • Hallo zusammen,

    ich habe ein Listentemplate geschrieben und eine Iteratortemplateklasse als friend definiert. Jedoch motzt mein Compiler (.NET 2003) das die Datentypen im Iterator nicht bekannt sind?!?

    Hier mein Code:

    #ifndef LIST_TMP1_H
    #define LIST_TMP1_H
    
    // Übung 6.2 - Templateklassen
    // Datei: list_tmp.h
    
    // Allgemeine Listenklasse
    
    template<class T> class Iterator;
    
    template<class T>
    class List {
      struct ListElem {   // Listenelement
    	 ListElem *succ;   // Nachfolgezeiger
    	 T *info;          // Zeiger auf Objekt mit Nutzdaten
      } *head;            // Listenanker
    
    public:
      List(void);
      ~List(void);
      T *find(T *el);    // suchen
      void insert(T *el);   // vorne einketten
      T *remove(T *el);     // ausketten
      friend class Iterator<T>;
    };
    
    // Iteratorklasse für allgemeine Liste
    
    template<class T>
    class Iterator  {
      List<T> &list;
      List<T>::ListElem *curr;
    
    public:
      Iterator(List<T> &l);
      T *next(void);
      void reset(void);
    };
    
    #endif // LIST_TMP1_H
    

    und die Fehlermeldung:

    d:\-=FH=-\Sem IV\DV3\kap_6_new\list_tmp1.h(34): error C2501: 'Iterator<T>::curr' : missing storage-class or type specifiers
    d:\-=FH=-\Sem IV\DV3\kap_6_new\list_tmp1.h(34): error C2143: syntax error : missing ';' before '*'
    d:\-=FH=-\Sem IV\DV3\kap_6_new\list_tmp1.h(34): warning C4346: 'List<T>::ListElem' : dependent name is not a type

    Vielleicht hat ja von euch jemand eine Ahnung wieso hier ein Fehler vorliegt.

    Danke && Gruß

    Jochen



  • template<class U>
    friend class Iterator;
    

    //nicht sicher ist:

    typename List<T>::ListElem* curr//muss hier ein typename hin?
    


  • Perfekt!!!
    Mit dem Schüsselwort

    typename
    

    ist das Problem gelöst.

    Manche Leute haben echt Ahnung!

    Gruß && Danke

    Jochen



  • Schau mal hier http://www.c-plusplus.net/forum/viewtopic.php?t=91586. Da erklärt Hume warum das so ist.



  • Mit .Net 2002 lässt sich das Programm ohne Fehler erstellen?!? Wurde dieses Schüsselwort erst mit .Net 2003 eingeführt?

    Gruß && Danke

    Jochen



  • Nein. "typename" gibt es schon wesentlich länger als das .NET Studio 2002.



  • DonKing schrieb:

    Mit .Net 2002 lässt sich das Programm ohne Fehler erstellen?!? Wurde dieses Schüsselwort erst mit .Net 2003 eingeführt?

    typename hat mit .NET nix zu tun, das ist ein C++ Schlüsselwort.


Anmelden zum Antworten