2017-02-25 2 views
0

Das folgende ist eine interne geschachtelte Klasse innerhalb einer Vorlagenklasse für eine Ausnahmeliste. Ich erhalte den Fehler: "Höhe wurde in diesem Bereich nicht deklariert" in der Zeile, die als nächstes deklariert.Fehler: ungültige Verwendung von nicht statischen Datenelement, Variable wurde in diesem Bereich nicht angegeben

 class Node{ 
      public: 
       Node(int height){ 
        this->height = height; 
       } 
       Node(Key_t key, Mapped_t obj, int height){ 
        value = std::make_pair(key, obj); 
        this->height = height; 
       } 
       SkipList<Key_t, Mapped_t>::Node *next[height]; 
       int getHeight(){return height;} 
       Key_t getKey(){return value.first;} 
       Mapped_t getObj(){return value.second;} 
      private: 
       std::pair<Key_t, Mapped_t> value; 
       int height; 
     }; 

Verschieben der Wertangabe und Höhe vor allem anderen, wie folgt, ändert sich die Fehler auf „ungültig Verwendung von nicht-statisches Datenelement.

  class Node{ 
       private: 
        std::pair<Key_t, Mapped_t> value; 
        int height; 
       public: 
        Node(int height){ 
         this->height = height; 
        } 
        Node(Key_t key, Mapped_t obj, int height){ 
         value = std::make_pair(key, obj); 
         this->height = height; 
        } 
        SkipList<Key_t, Mapped_t>::Node *next[height]; 
        int getHeight(){return height;} 
        Key_t getKey(){return value.first;} 
        Mapped_t getObj(){return value.second;} 
      }; 

ich ratlos bin wie für ., was diese zu lösen zu tun hier die ganze Klasse ist:

template <class Key_t, class Mapped_t> 
class SkipList{ 
public: 
    SkipList(int prob, int max){ 
     probOutOf100 = prob; 
     maxHeight = max; 
     head = new SkipList<Key_t, Mapped_t>::Node(maxHeight); 
     tail = new SkipList<Key_t, Mapped_t>::Node(maxHeight); 
     for(int i = 0; i < maxHeight; i++){ 
      head->next[i] = tail; 
     } 
    } 
    ~SkipList(){ 
     delete head; 
     delete tail; 
    } 

    class Node{ 
     public: 
      Node(int height){ 
       this->height = height; 
      } 
      Node(Key_t key, Mapped_t obj, int height){ 
       value = std::make_pair(key, obj); 
       this->height = height; 
      } 
      SkipList<Key_t, Mapped_t>::Node *next[height]; 
      int getHeight(){return height;} 
      Key_t getKey(){return value.first;} 
      Mapped_t getObj(){return value.second;} 
     private: 
      std::pair<Key_t, Mapped_t> value; 
      int height; 
    }; 

    Node *head; 
    Node *tail; 
    int probOutOf100; 
    int maxHeight; 
} 

Antwort

1

Problem 1

können Sie nicht Verwenden Sie, was der Compiler noch nicht gesehen hat, also löst das Verschieben der Deklaration über die Verwendung dieses Problem. Du hast das schon gemacht. Gut gemacht.

Problem 2

height nicht bekannt sein, bis das Objekt aufgebaut ist. Sie können das Objekt nicht erstellen, wenn die Größe des Objekts nicht bekannt ist, und height bestimmt die Größe next, die zur Größe des Objekts beiträgt. Catch 22.

Empfehlen Sie anstelle des Arrays eine std::vector und initialisieren Sie den Vektor mit height in den Konstruktoren s. Beispiel:

std::vector<SkipList<Key_t, Mapped_t>::Node *> next; 

Node(int height): height(height), next(height) 
{ 
} 
Node(Key_t key, Mapped_t obj, int height): 
    value(std::make_pair(key, obj)), 
    height(height), 
    next(height) 
{ 
} 
2

In der Zeile unter

SkipList<Key_t, Mapped_t>::Node *next[height]; 

Sie versuchen, ein Array von Zeigern zu erklären. Dies ist jedoch nicht möglich, es sei denn, height ist zum Zeitpunkt der Kompilierung bekannt.

Sie können es in eine vector ändern und es zur Laufzeit initialisieren.

std::vector<SkipList<Key_t, Mapped_t>::Node*> next; 


... 

Node(int height) : next(height) { 
    this->height = height; 
} 

PS Ich bin nicht sicher, welche Datenstruktur ein Array von Zeigern als der „nächste“ Knoten eines Knotens verwendet. Nur etwas zum Nachdenken.

Verwandte Themen