参数为(const T *&)或(T *&)或(const T * const&)或(T * const&)的方法

时间:2018-08-25 02:58:57

标签: c++

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)
{
    ......
}

您能告诉我以上问题是对是错的原因吗? 谢谢!

1 个答案:

答案 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的常量对象的常量指针的引用。