2017-02-25 127 views
0

以下是跳過列表的模板化類中的內部嵌套類。我在下一行聲明瞭錯誤:「高度未在此範圍內聲明」。錯誤:無效使用非靜態數據成員,未在此範圍內聲明變量

 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; 
     }; 

運動的價值和高度聲明一切之前,如下所示,改變錯誤「無效使用非靜態數據成員的。

  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;} 
      }; 

我不知所措作爲。怎樣做才能解決這個問題這裏是整個類:

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; 
} 

回答

1

問題1

你不能使用編譯器還沒有看到的東西,因此將該聲明移到用法上方可解決此問題。你已經做到了。做得好。

問題,直到對象被構造2

height將不是已知的。如果對象的大小未知,則無法構造該對象,並且height確定了造成對象大小的next的大小。 Catch 22.

推薦使用std::vector代替陣列,並在構造函數的Member Initializer List中用height初始化矢量。例如:

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

在線以下

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

要嘗試聲明指針數組。但是,除非編譯時知道height,否則不能這樣做。

您可能需要將其更改爲vector並在運行時對其進行初始化。

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


... 

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

PS我不知道什麼樣的數據結構使用指針數組作爲節點的「下一個」節點。只是想一想。