Как уже отмечали другие, pop_back
делает вашу выходную операцию разрушительной.Просто невозможно прочитать содержимое стека, не опустошив его… Такова природа чистого стека.
Кроме того, перегрузка операторов для стандартных типов очень плохая практика.Из-за того, как работает поиск имени (то есть, как язык находит функцию перегрузки для вызова), предполагается, что функции перегрузки находятся в том же пространстве имен, что и типы, для которых они перегружаются.Поскольку вы не можете поместить функцию в std::
, следующая лучшая альтернатива - это глобальное пространство имен, которое затем загрязняет это.
Но проблема решаема!К счастью, stack
предусматривает наследование.Базовый контейнер доступен для производных классов и называется c
.
template< typename value_arg, typename container_arg = std::deque< value_arg > >
struct printable_stack : std::stack< value_arg, container_arg > {
// provide constructors :v( . This is better supported in C++11.
printable_stack( container_arg const &in = container_arg() )
: std::stack< value_arg, container_arg >( in ) {}
friend std::ostream &operator<<
( std::ostream &s, printable_stack const &o ) {
for ( typename container_arg::iterator i = this->c.begin();
i != this->c.end(); ++ i ) {
s << * i << ' ';
}
}
};
Кроме того, наличие выделенного класса позволяет вам предоставить дополнительный член для хранения строки разделителя, поэтому он может быть чем-то помимопростой символ пробела.