2016-06-13 7 views
0

これは今のところ入手したコードですが、不完全な変数型のcontainer :: iteratorエラーのためにコンパイルされません。私のコードを整理する方法を理解しようとしているので、クラスとイテレータはまだかなり単純です。なぜ不完全な型のエラーがあり、それを解決するのですか?

template <typename T> class container { 
    using size_type = std::size_t; 
    using pointer   = T*; 
    using const_pointer  = const T*; 
public: 
    class iterator; 
    container (size_type n=0): data {n>0 ? new T[n]:nullptr}, size {n>0 ? n:0}{}; 
    container (iterator begin, iterator end){}; 
    ~container(){ delete[] data; }; 
private: 
    pointer  data; 
    size_type size; 
}; 

template <typename T> class container<T>::iterator { 
public: 
    iterator (pointer p): current {p} {}; 
    iterator& operator++(){ current++; return *this; }; 
    iterator& operator--(){ current--; return *this; }; 
    reference operator*(){ return *current; }; 
    bool operator== (const iterator& b) const { return current == b.current; }; 
    bool operator!= (const iterator& b) const { return current != b.current; }; 
private: 
    pointer current; 
}; 

可能であれば、コンテナクラスの反復子定義を保持したいと思います。すべての返信いただきありがとうございます。

答えて

2

可能であれば、コンテナクラスの反復子定義を保持したいと思います。

containerのメンバー関数の引数を型の定義なしで適切に解析できないため、そうではありません。

インラインで移動します。 iteratorを使用していますが、コード内のその時点でiteratorのない定義、宣言のみがありません

2
container (iterator begin, iterator end){}; 

。このコンストラクタを宣言する前に、イテレータの構造を定義する必要があります。

You このコンストラクタを変更して参照を取得することができます。次に、をクラス内でと宣言できますが、イテレータの定義の下に定義します。 IMOこれは最善の方法ではありませんが、可能です。

+0

ありがとう、私はこれが問題の原因となっていることを知っています。私はそこに「通常の」回避策があるのか​​疑問に思った。それは、インライン定義以外のものではないようです。 –

関連する問題