我目前很难弄清楚该怎么做。我现在的想法是每次在内部递归调用pop()
时都拥有堆栈this
print
,但这对我不起作用。
template <class T>
void Stack<T>::print() const {
if (top->next == nullptr) {
cout << "End of list" << endl;
}
else {
cout << top->data;
this->pop();
print();
}
}
当我通过Stack<int> test
在main中声明一个int类型的Stack时,出现错误"passing const Stack<int> as 'this' argument discards qualifiers
。
答案 0 :(得分:1)
passing const Stack<int> as 'this' argument discards qualifiers
这是您的问题。您用print
来限定const
函数。这是保证您在打印时不会更改堆栈(这是合理的期望)。调用pop
会改变堆栈,从而破坏了承诺。
编译器错误消息中的“限定符”为const
,因此“放弃限定符”基本上意味着“放弃了不更改*this
的承诺”。
答案 1 :(得分:0)
对于初学者来说,该功能不是递归功能(如您在更新问题之前所显示的那样)。
此外,当为空堆栈调用时(即,指针top
等于nullptr
时,它具有未定义的行为。
对于错误消息,然后函数pop
会从常量函数print
调用时更改堆栈(它是非常量成员函数)。因此,编译器会发出错误消息。
因此,假设函数print
将在输出其值的过程中更改堆栈,然后应将其声明为非恒定函数。
该函数的外观如下所示。我假设函数push
或其类似物声明为
void push( const T & );
您在这里。
template <class T>
std::ostream & Stack<T>::print( std::ostream &os = std::cout )
{
if ( this->top )
{
os << top->data << ' ';
auto value = top->data;
this->pop();
this->print( os );
this->push( value );
}
return os;
}
该函数可以像
那样调用Stack<int> test;
//...
test.print() << '\n';
这里是一个演示程序,该示例程序显示了上面的函数,并且对标准类模板std :: stack进行了较小的更改(因为未显示堆栈定义)。
#include <iostream>
#include <stack>
template <class T>
std::ostream & print( std::stack<T> &st, std::ostream &os = std::cout )
{
if ( not st.empty() )
{
os << st.top() << ' ';
auto value = st.top();
st.pop();
print( st, os );
st.push( value );
}
return os;
}
int main()
{
std::stack<int> st( std::stack<int>::container_type { 5, 4, 3, 2, 1 } );
print( st ) << '\n';
return 0;
}
程序输出为
1 2 3 4 5