2017-02-25 22 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我不知道什么样的数据结构使用指针数组作为节点的“下一个”节点。只是想一想。