2017-07-23 103 views
0

我有以下類,我試圖從內部類迭代從一個內部類訪問外部公有成員

#ifndef __LISTMAP_H__ 
#define __LISTMAP_H__ 

#include "xless.h" 
#include "xpair.h" 

template <typename Key, typename Value, class Less=xless<Key>> 
class listmap { 
    public: 
     using key_type = Key; 
     using mapped_type = Value; 
     using value_type = xpair<const key_type, mapped_type>; 
    private: 
     Less less; 
     struct node; 
     struct link { 
     node* next{}; 
     node* prev{}; 
     link (node* next, node* prev): next(next), prev(prev){} 
     }; 
     struct node: link { 
     value_type value{}; 
     node (node* next, node* prev, const value_type&); 
     }; 
     node* anchor() { return static_cast<node*> (&anchor_); } 
     link anchor_ {anchor(), anchor()}; 
    public: 
     class iterator; 
     listmap(){}; 
     listmap (const listmap&) = default; 
     listmap& operator= (const listmap&) = default; 
     ~listmap(); 
     iterator insert (const value_type&); 
     iterator find (const key_type&); 
     iterator erase (iterator position); 
     iterator begin() { return anchor()->next; } 
     iterator end() { return anchor(); } 
     bool empty() const { return begin() == end(); } 
}; 


template <typename Key, typename Value, class Less> 
class listmap<Key,Value,Less>::iterator { 
    private: 
     friend class listmap<Key,Value>; 
     listmap<Key,Value,Less>::node* where {nullptr}; 
     iterator (node* where): where(where){}; 
    public: 
     iterator(){} 
     value_type& operator*(); 
     value_type* operator->(); 
     iterator& operator++(); //++itor 
     iterator& operator--(); //--itor 
     void erase(); 
     bool operator== (const iterator&) const; 
     bool operator!= (const iterator&) const; 
}; 

template <typename Key, typename Value, class Less> 
value_type& listmap<Key,Value,Less>::iterator<Key,Value,Less>::operator*() 
{ 
     return where->value; 
} 

#include "listmap.tcc" 
#endif 

的問題是,VALUE_TYPE重載運算符*是從類公共成員listmap,它不是靜態的,所以我不知道如何完成operator *()的聲明。我不想通過更改代碼的結構來修復該錯誤。例如:製作

using value_type = xpair<const key_type, mapped_type>; 

全球。我只是想知道是否有一些其他技巧可以用來訪問value_type。

....編輯:我不知道內部類如何識別VALUE_TYPE

+0

好的,那麼你會如何做這個聲明? –

+0

糟糕,我以爲你試圖訪問一個成員變量或函數,而不是一個類型。 – immibis

回答

0

這是幾乎一樣的迭代器,你只需要添加typename關鍵字

typename listmap<Key,Value,Less>::value_type 

static岬沒有按」對於某種類型而言,

別名內迭代

template <typename Key, typename Value, class Less> 
class listmap<Key,Value,Less>::iterator { 
    ... 
    using value_type = typename listmap<Key,Value,Less>::value_type; 

}; 

讓您更簡潔地寫定義使用自動後綴類型:

template <typename Key, typename Value, class Less> 
auto listmap<Key,Value,Less>::iterator::operator*() -> value_type& 
{ 
     return where->value; 
} 

小心:內部iterator類是沒有模板,只有listmap是:

listmap<Key,Value,Less>::iterator<Key,Value,Less>::operator 
//        ~~~~~~~~~~~~~~~~ remove this 

順便說一句,別忘了others

相關問題