2013-01-09 38 views
1

我正在以一種類似STD的方式編寫SkipList實現:使用分配器,迭代器等。整個類已完成並正在工作,但現在我試圖爲我所做的課程寫一個頭文件。我現在的頭文件的內容是:使用std :: pair的頭文件中的typedef錯誤類

template<class _MySkiplist> 
    class _Skiplist_const_iterator; 

template<class _MySkiplist> 
    class _Skiplist_iterator; 

template<class _Kty, 
    class _Pr, 
    class _Alloc> 
     class skiplist 
     { 
      typedef skiplist<_Kty, _Pr, _Alloc> _Myt; 

      typedef typename _Skiplist_const_iterator<_Myt> const_iterator; 
      typedef typename _Skiplist_iterator<_Myt> iterator; 

      typedef typename _Alloc::size_type size_type; 

      typedef std::pair<iterator, iterator> _Pairii; 
      typedef std::pair<iterator, bool> _Pairib; 

      skiplist(); 
      skiplist(const _Alloc& _Al); 
      skiplist(const _Pr& _Pred); 
      skiplist(const _Pr& _Pred, const _Alloc& _Al); 
      ~skiplist(); 

      iterator begin(); 
      const_iterator begin() const; 
      iterator end(); 
      const_iterator end() const; 

      size_type size() const; 
      size_type max_size() const; 
      bool empty() const; 

     // _Pairib insert(_Kty& _val); 
     // _Pairib insert(const _Kty& _val); 
      size_type erase(const _Kty& x); 
      void clear(); 

      _Pr key_comp() const; 
      _Pr value_comp() const; 

      iterator find(const _Kty& x); 
      size_type count(const _Kty& x) const; 
      iterator lower_bound(const _Kty& x) const; 
      iterator upper_bound(const _Kty& x) const; 
    //  _Pairii equal_range(const _Kty& x) const; 

      _Alloc get_allocator() const; 
     }; 

我讓越來越以下錯誤:

錯誤1個錯誤C2143:語法錯誤:缺少 ';' '<'

錯誤3錯誤C2238:在';'之前的意外標記(s)

錯誤5錯誤C2238:在';'之前的意外標記(s)

錯誤2錯誤C4430:缺少類型說明符 - 假定爲int。注意:C++ 不支持默認int

所有這些錯誤是指按照頭文件中的兩行:

 typedef std::pair<iterator, iterator> _Pairii; 
     typedef std::pair<iterator, bool> _Pairib; 

我跑出來的想法,爲什麼會出現錯誤。

+0

您的標識符在C++代碼中是非法的:下劃線後跟大寫字母被保留。 –

+0

也許編譯器被迭代器typedef中的'typename'弄糊塗了? –

+0

將所有內容更改爲下劃線+小寫字母並且沒有變化 – MarcinJuraszek

回答

1

是造成這種情況的錯誤是,你在非依賴型名稱中使用typename

typedef typename _Skiplist_const_iterator<_Myt> const_iterator; 
typedef typename _Skiplist_iterator<_Myt> iterator; 

刪除typename,幷包括頭<memory>其中std::pair定義的伎倆。

還要注意你的標識符是無效的(標識符開始下劃線其次是其他下劃線或大寫字母被保留),並且你允許使用可讀標識符。 ;-)標準庫實現使用保留標識符來避免與客戶端代碼發生衝突。但你不應該那樣做。

+0

刪除'typename'後沒有變化。 – MarcinJuraszek

+0

嗯。在這種情況下,如果你能告訴我們錯誤發生在哪裏,這將有所幫助。它爲我編譯。 –

+0

正如問題所述:所有錯誤消息都是指這兩行使用'_pairib'和'_pairii'類型定義 – MarcinJuraszek