Probleme mit Verwendung einer Templateklasse innerhalb einer anderen Templateklasse



  • Hallo,

    implementiere zur Zeit eine Hashtabelle, die intern mit einem Array realisiert ist, das wiederum auf Listen zeigt.
    Sowohl die Hashtabelle als auch die Liste sind als Templateklassen programmiert.
    Wenn ich versuche die Liste innerhalb der Hashtabelle zu erzeugen gibt es einen Fehler, der besagt, dass statische konstante Werte für so eine Tabelle verwendet werden müssten. Was kann ich da tun, um dieses Problem zu umgehen?

    #include "List.h"
    
    template <class K, class V>
    HashTable {
      int size;
      List < K, V >* table;
      public:
            HashTable () {
              size = 0;
              table = new List <K, V>[size];
              List <K, V>* list = new List <K, V>();
              for (int i = 0; i < size; i++) {
                 table[i] = list;
            }
            void put (K &key, V &value) {
               int index = toHash(key);
               table[index].add(key, value);
            }
    
                  .
                  .
                  .
    };
    

    Gruß
    Generic412



  • Das Problem hat nichts mit Templates zu tun, du hast nur eine Pointer-Ebene zu viel angelegt.

    (die einzelnen Elemente von 'table' sind reine Listen und keine Zeiger, also kannst du sie auch nicht mit einem Zeiger füllen. Und da du sie sowieso nur per Default-Ctor initialisieren willst, ist das auch gar nicht nötig - durch den Aufruf table=new List<K,V>[size]; hast du schon ein Array mit 'size' sauber initialisierten Listen, der Rest deines Hastable-Ctors ist überflüssig)



  • CStoll schrieb:

    Das Problem hat nichts mit Templates zu tun, du hast nur eine Pointer-Ebene zu viel angelegt.

    (die einzelnen Elemente von 'table' sind reine Listen und keine Zeiger, also kannst du sie auch nicht mit einem Zeiger füllen. Und da du sie sowieso nur per Default-Ctor initialisieren willst, ist das auch gar nicht nötig - durch den Aufruf table=new List<K,V>[size]; hast du schon ein Array mit 'size' sauber initialisierten Listen, der Rest deines Hastable-Ctors ist überflüssig)

    @CStoll
    Danke, jetzt glaube ich zu verstehen. :p Wenn ich z.B. table [0] angebe, greife ich auf eine Liste zu, also List <K,V> listElement = table[0] eine Liste;
    Wenn ich jetzt also schreiben würde: (*table + 3) dann wäre das nur ein Zeigerdurchlauf auf das dritte Arrayelement, das wiederum eine andere Liste beinhaltet. Der Zeiger durchläuft also nur das Array, aber nicht die Listen... 💡 Sehe ich das Richtig?

    Gruß 🙂


Anmelden zum Antworten