c++ - 带有参数的方法 (const T *&) or (T * &) or(const T * const &) or(T * const &)

标签 c++

<分区>

template<class T>
class BNode
{
public:
    T data;
    BNode *parent, *left, *right;

    explicit BNode(T d) : data(d), parent(nullptr), left(nullptr),
                          right(nullptr)
    {}

};

问题 1:这是对的。

template<class T>
void BST<T>::InOrder_(BNode<T> *&s)
{
    if (s)
    {
        InOrder_(s->left);
        cout << s->data << ' ';
        InOrder_(s->right);
    }
}

问题 2:这是错误的。

template<class T>
void BST<T>::InOrder_(const BNode<T> *&s)
{
    if (s)
    {
        InOrder_(s->left);
        cout << s->data << ' ';
        InOrder_(s->right);
    }
}

错误:无法绑定(bind)类型为“const BNode<int>*&”的非常量左值引用' 为 ' const BNode<int>* 类型的右值'

     InOrder_(s->left);
              ~~~^~~~

问题 3:这是对的。

template<class T>
void BST<T>::InOrder_(BNode<T> *const &s)
{
    ......
}

问题 4:这是对的。

template<class T>
void BST<T>::InOrder_(const BNode<T> *const &s)
{
    ......
}

你能告诉我上面的问题为什么是对的还是错的? 谢谢!

最佳答案

InOrder_(const BNode<T> *&s) {

接受指向常量指针的可变引用。这意味着该函数不能改变 BNode 对象,但它可以设置一个新的指针。

void BST<T>::InOrder_(const BNode<T> *&s) 
{
  if (s)
  { 
    InOrder_(s->left);

这里,s->left 是一个常量指针(因为 s 指向 const BNode),它指向一个可变的 BNode。指针本身无法修改,但它指向一个可以修改的对象。

问题是 InOrder_ 可以修改指针本身(对指针的常规引用)。编译器不允许这样做,因为在调用点不能修改指针(指针是 const)。

要解决此问题,请将指针本身声明为 const,而不仅仅是它指向的对象:

void BST<T>::InOrder_(const BNode<T> * const &s) 

从右到左阅读声明:s 是对指向类型为 BNode 的常量对象的常量指针的引用。

关于c++ - 带有参数的方法 (const T *&) or (T * &) or(const T * const &) or(T * const &),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52013665/

相关文章:

c++ - 使用 boost 在 C++-11 中封装随机数生成器

c++ - QtCreator : Loading External Library

c++ - 使用递归将数组中的元素相乘

c++ - 如何将 Ncurses 添加到 Visual Studio 2017 中的项目?

c++ - 用静态数组覆盖指针属性

android - ndk-gdb 无法找到 gdb.setup

c++ - 定义集合 C++

c++ - SVD 在 C/C++ 中解决 harwell-boeing 稀疏 a.x=b 系统?

c++ - 没有匹配的函数用于调用c++

C++ SmartPointers 在 self 分配时泄漏?