2016-06-13 22 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的成員函數的參數如果沒有它們的類型定義就無法正確分析。

將其移入內聯。

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

使用iterator,但在代碼中的那一點也沒有定義的iterator,只是一個聲明。在你甚至可以聲明這個構造函數之前,你需要定義你的迭代器的結構。

可能改變這個構造函數來引用。然後你可以在你的類中聲明,但是在迭代器的定義下面定義它。海事組織這不是最好的方式,但它是可能的。

+0

謝謝,我知道這是導致問題的線路。我想知道是否有一個「常規」的解決方法。除了內聯定義,它似乎不是。 –

相關問題