2016-06-13 2 views
0

이것은 현재 얻은 코드이지만 불완전한 variable 유형의 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){}; 

. 이 생성자를 선언하기 전에 반복자의 구조를 정의해야합니다.

참조를 가져 오도록이 생성자를 변경할 수 있습니다. 그런 다음 을 클래스 내에서으로 선언 할 수 있지만 iterator의 정의 아래에서 정의하십시오. IMO가 가장 좋은 방법은 아니지만 가능합니다.

+0

감사합니다. 문제의 원인이되는 줄은 알고 있습니다. 나는 그것에 대한 '일반적인'해결 방법이 있는지 궁금해했다. 그것은 인라인 정의를 제외하고는 보이지 않습니다. –

관련 문제