代码之家  ›  专栏  ›  技术社区  ›  user2891951

依赖作用域中的typename

  •  -2
  • user2891951  · 技术社区  · 11 年前

    下面是我的代码的浓缩版本,它给了我一个编译器错误。编译器告诉我将typename放在“std::deque::reverse_iterator”前面,这很有意义。但如果我这样做了,我会在底部收到错误。这是什么意思?如何解决?

    #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|
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   Kerrek SB    11 年前

    没有任何依赖 std::deque<T> ,所以不能有 typename 。只有右边的东西 :: 其中左边取决于一个模板参数是依赖的。

        2
  •  1
  •   chris    11 年前

    这是一个很好的例子,说明如何使用 auto 这不仅能帮你节省打字时间。你在一个 const 成员函数,但尝试使用数据成员的 reverse_iterator const_reverse_iterator .

    改变 typename std::deque<T>::reverse_iterator typename std::deque<T>::const_reverse_iterator 或者更简单地, 汽车 .

    这是额外的 typename 在您的数据成员上。