Просто удалите const
из декларации push
и pop
.
void push(const T &x) {
not
void push(const T &x) const{
Ключевое слово const
для метода предназначено для методов, которые не изменяют состояние объекта.Это не относится к push
и pop
, они меняют стек.
Это не то же самое, что const T& x
.Объект x
не изменяется, будучи помещенным в стек.Таким образом, это может быть объявлено const
.
ОБНОВЛЕНИЕ
Другая постоянная ошибка здесь
friend ostream& operator<< (ostream& out,const stack& s){
while(s.empty()!=1)
out<<s.pop();
}
operator<<
должен выводить стек, он не должен изменятьсястек (очевидно).Стек s
был объявлен как const
в operator<<
, так что это хорошо.Но теперь посмотрим, что делает operator<<
.Он вызывает pop
, поэтому он меняет стек .Это неправильно в принципе (потому что логически operator<<
не должно изменять выводимый стек), и это неправильно в C ++, потому что стек s
объявлен как const.
Так что переписайте operator<<
, чтобы он неизменить стекЧто-то более или менее подобное
friend ostream& operator<< (ostream& out,const stack& s) {
for (int i = 0; i < s.top; ++i)
out << s.data[i] << ' ';
return out;
}