我遇到了以下错误,我遇到了麻烦:
错误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;
}
只是玩模板和简单的数据结构。 谢谢你的回答。
答案 0 :(得分:4)
让我们开始简单:
const X*
是指向常量X const X* const
是指向常量X const X* const*
是指向常量回到你的问题:
X* const* previousNode
是指向X *previousNode
是指向X *previousNode = ...
尝试为此常量指针指定一些内容。这是不可能的,指针是不变的! 答案 1 :(得分:3)
IsValid
方法的签名指定(使用const
),this
是一个常量对象,即其类型为const X*
。将previousNode
的类型更改为const X**
可以解决您的问题。