2013-10-17 28 views
-2

下面是我的代码的精简版,它给了我一个编译器错误。编译器告诉我把typename放在'std :: deque :: reverse_iterator'之前,这很有道理。但如果我这样做,我会收到底部的错误。这是什么意思?如何解决?type dependent in dependent scope

#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。只有在左边依赖于模板参数的::右侧的内容才是相关的。

相关问题