为什么在const方法中返回const X * const指针?

时间:2016-07-04 20:15:38

标签: c++ pointers

我遇到了以下错误,我遇到了麻烦:

  

错误1错误C2440:'=':无法从'const X< ...>转换* const'到'X< ...> * const'

我正在尝试使用指向const指针的指针来在树遍历期间跟踪节点:

bool IsValid() const
  {
    X* const* previousNode = new X*;
    return this->IsValid(previousNode);
  }

  bool IsValid(X* const* previousNode) const
  {
    ...
    if (!*previousNode)
      *previousNode = this; // Error
    ...

    return true;
  }

为什么 const X * const 类型,不能用作 * Const *?

由于该方法是const方法,我的理解是它保护对象本身被修改。那么为什么编译器会试图强制指针的常量返回这个?

我无法使用堆栈溢出的搜索引擎找到这个问题的答案。

感谢您的回答。

以下是我最终使用的结局代码,如果我可以使用某人:

bool IsValid() const
  {
    std::unique_ptr<const BST*> previousNode = std::unique_ptr<const BST*>(new const BST*);
    *previousNode = nullptr;
    return this->IsValid(prevNode);
  }

bool IsValid(std::unique_ptr<const BST*>& previousNode) const
{
  // Recurse on left child without breaking if not failing
  if (this->leftChild &&!this->leftChild->IsValid(previousNode))
    return false;

  // First node retrieved - assign
  if (!*previousNode)
    *previousNode = this;
  // Previous data does not compare well to the current one - BST not valid
  else if (!Compare()((*previousNode)->data, this->data))
    return false;

  // Set current node
  *previousNode = this;

  // Recurse on right child
  if (this->rightChild && !this->rightChild->IsValid(previousNode))
    return false;

  return true;
}

只是玩模板和简单的数据结构。 谢谢你的回答。

2 个答案:

答案 0 :(得分:4)

让我们开始简单:

  • a const X*是指向常量X
  • 的指针
  • a const X* const是指向常量X
  • 的常量指针
  • a const X* const*是指向常量
  • 的常量指针的指针

回到你的问题:

  • X* const* previousNode是指向X
  • 的常量指针的指针
  • 所以*previousNode是指向X
  • 的常量指针
  • *previousNode = ...尝试为此常量指针指定一些内容。这是不可能的,指针是不变的!

答案 1 :(得分:3)

IsValid方法的签名指定(使用const),this是一个常量对象,即其类型为const X*。将previousNode的类型更改为const X**可以解决您的问题。