依赖作用域中的类型名称

typename in dependent scope

本文关键字:类型 作用域 依赖      更新时间:2023-10-16

下面是我的代码的精简版本,它给了我一个编译器错误。编译器告诉我把typename放在'std::d eque::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|
std::deque<T>没有任何

依赖性,所以不能有typename。只有左侧依赖于模板参数的::右侧的内容是相关的。

是一个很好的例子,说明使用auto比节省打字更能帮助您。您正在使用const成员函数,但尝试使用数据成员的reverse_iterator,而不是const_reverse_iterator

typename std::deque<T>::reverse_iterator更改为 typename std::deque<T>::const_reverse_iterator ,或者更简单地说,auto

这是对数据成员的额外typename的补充。