typename в зависимой области

Ниже приведена сокращенная версия моего кода, которая дает мне ошибку компилятора. Компилятор говорит мне поставить 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

Решение

Это хороший пример использования auto поможет вам больше, чем просто сохранение набора текста. Вы в const функция-член, но пытается использовать ваши данные члена reverse_iteratorне const_reverse_iterator,

+ Изменить typename std::deque<T>::reverse_iterator в typename std::deque<T>::const_reverse_iteratorили, проще говоря, auto,

Это в дополнение к дополнительным typename на вашем члене данных.

1

Другие решения

Там ничего не зависит от std::deque<T>так что не должно быть typename, Только вещи справа от :: где слева зависит от шаблона, параметр зависит.

3

По вопросам рекламы [email protected]