unique_length
问题1:是的。
template<class T>
class BNode
{
public:
T data;
BNode *parent, *left, *right;
explicit BNode(T d) : data(d), parent(nullptr), left(nullptr),
right(nullptr)
{}
};
问题2:这是错误的。
template<class T>
void BST<T>::InOrder_(BNode<T> *&s)
{
if (s)
{
InOrder_(s->left);
cout << s->data << ' ';
InOrder_(s->right);
}
}
错误:无法将类型“ template<class T>
void BST<T>::InOrder_(const BNode<T> *&s)
{
if (s)
{
InOrder_(s->left);
cout << s->data << ' ';
InOrder_(s->right);
}
}
”的非常量左值引用绑定到类型“ const BNode<int>*&
”的右值
const BNode<int>*
问题3:是的。
InOrder_(s->left);
~~~^~~~
问题4:是的。
template<class T>
void BST<T>::InOrder_(BNode<T> *const &s)
{
......
}
您能告诉我以上问题是对是错的原因吗? 谢谢!
答案 0 :(得分:1)
InOrder_(const BNode<T> *&s) {
接受对指向const的指针的可变引用。这意味着该函数无法更改BNode对象,但可以设置新的指针。
void BST<T>::InOrder_(const BNode<T> *&s)
{
if (s)
{
InOrder_(s->left);
此处,s->left
是一个常量指针(因为s
指向常量BNode
),它指向可变的BNode
。指针本身无法修改,但指向可以修改的对象。
问题是InOrder_
可以修改指针本身(对指针的常规引用)。编译器不允许这样做,因为在调用站点无法修改指针(指针为const)。
要解决此问题,请将指针本身声明为const,而不仅是将其指向的对象声明为:
void BST<T>::InOrder_(const BNode<T> * const &s)
从右到左读取声明:s是对类型为BNode
的常量对象的常量指针的引用。