2013-10-17 8 views
-2

다음은 컴파일러 오류가있는 압축 된 버전의 코드입니다. 컴파일러는 typename을 'std :: deque :: reverse_iterator'앞에 놓으라고 알려줍니다. 하지만 내가 그럴 경우 아래쪽에 오류가 표시됩니다. 무슨 뜻이에요? 어떻게 해결 될 수 있습니까?종속 범위의 typename

#include <iostream> 
#include <deque> 

template<class T> 
class Stack{ 

    public: 
     Stack(){} 
     ~Stack(){} 
     void push(T c) { s.push_back(c); } 
     void inspect() const{ 
      for(typename std::deque<T>::reverse_iterator i=s.rbegin(); i!=s.rend(); i++) 
       std::cout << *i << std::endl; 
     } 

    private: 
     typename std::deque<T> s; 
}; 


int main(){ 

    Stack<int> s; 
    s.push(1); 
    s.inspect(); 
    return 0; 
} 

오류 :

error: no matching function for call to 'std::_Deque_iterator<int, int&, int*>::_Deque_iterator(std::reverse_iterator<std::_Deque_iterator<int, const int&, const int*> >::iterator_type)'| 
note: candidates are:| 
note: std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Deque_iterator(const iterator&) [with _Tp = int; _Ref = int&; _Ptr = int*; std::_Deque_iterator<_Tp, _Ref, _Ptr>::iterator = std::_Deque_iterator<int, int&, int*>]| 
note: no known conversion for argument 1 from 'std::reverse_iterator<std::_Deque_iterator<int, const int&, const int*> >::iterator_type {aka std::_Deque_iterator<int, const int&, const int*>}' to 'const iterator& {aka const std::_Deque_iterator<int, int&, int*>&}'| 
note: std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Deque_iterator() [with _Tp = int; _Ref = int&; _Ptr = int*]| 
note: candidate expects 0 arguments, 1 provided| 
note: std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Deque_iterator(_Tp*, std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Map_pointer) [with _Tp = int; _Ref = int&; _Ptr = int*; std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Map_pointer = int**]| 
note: candidate expects 2 arguments, 1 provided| 

답변

1

auto을 사용하면 입력 내용을 저장하는 것 이상의 좋은 예가 될 수 있습니다. const 회원 기능이지만 데이터 회원의 reverse_iterator (const_reverse_iterator이 아님)을 사용하려고합니다.

typename std::deque<T>::reverse_iterator에서 typename std::deque<T>::const_reverse_iterator으로 변경하거나 더 간단히 auto입니다.

이것은 데이터 회원의 추가 typename에 추가됩니다.

3

std::deque<T>에 대한 의존 아무것도 없다, 그래서 typename이 아니어야합니다. 왼쪽이 템플리트 매개 변수에 의존하는 :: 오른쪽의 것만이 종속적입니다.