0

我在二叉搜索树的类中有一个键和一个指向结构中定义的左右节点的指针。

我在类的复制辅助函数中遇到 parasoft 错误,因此建议将代码更改为:

BinaryTree::Node* BinaryTree::copyHelper(const Node* other)
{
    if(other == NULL)
    {
        return NULL; // If there's no Node to copy, return NULL.
    }
    else
    {
        //Node* newNode  = new Node; 

        typedef std::unique_ptr<Node> NodePtr;  
        NodePtr newNode(new Node); 

        if(newNode)
        {
            newNode->name  = other->name;
            newNode->left  = copyHelper(other->left); 
            newNode->right = copyHelper(other->right);
        }

        return newNode;
    }
}

现在我在 newNode 的 return 语句上收到错误:

IntelliSense:没有合适的转换NodePtr函数BinaryTree::Node *

有任何想法吗?

4

4 回答 4

3

啊啊。您无法将 a 转换unique_ptr<T>T*. 它们不是同一类型,并且它们没有相同的语义,特别是在它们被复制时。这就是为什么unique_ptr<T>没有转换运算符到T*. T*不是一个类,因此您不能像返回声明的返回类型的子类那样依赖多态性来为您完成工作(实际上unique_ptr,语义差异意味着子类化无论如何都是错误的关系)。

所以你在这里别无选择 - 你必须返回 aunique_ptr<T>并让你的调用者处理后果,因为他们需要知道它是 aunique_ptr<T>并且表现得像一个。如果您觉得这负担过重,我建议您阅读智能指针,以更好地了解它们是什么以及它们为您做了什么。

您可能还需要考虑它是否是正确类型的智能指针类,因为它可能shared_ptr<T>具有更适合您的语义。

于 2012-05-02T14:32:56.767 回答
3

如果我理解它copyHelper是一个内部函数,而不是接口的一部分。如果是这样,那么最简单的解决方案是更改签名以返回 aunique_ptr而不是原始指针。

另一种方法是releaseunique_ptr内部调用copyHelper以放弃所有权,并让调用者自己收回它unique_ptr(因为你需要使用它reset),但是当你将它存储在原始指针时没有意义aunique_ptr在接下来的步骤中。

于 2012-05-02T14:50:16.300 回答
2

这是你的功能:

BinaryTree::Node* BinaryTree::copyHelper(const Node* other) { ...}

它返回 a BinaryTree::Node*,并且应该返回 a unique_ptr<Node>

std::unique_ptr<BinaryTree::Node> BinaryTree::copyHelper(const Node* other) { ...}
于 2012-05-02T14:40:33.563 回答
1

函数的返回类型和您实际返回的值具有不同的类型,并且在您返回的内容与您的函数声明返回的内容之间不存在隐式转换。

于 2012-05-02T14:36:51.480 回答