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ステートメントでエラーが発生します。

NodePtrIntelliSense:からへの適切な変換関数がありませんBinaryTree::Node *

何か案は?

4

4 に答える 4

3

ああああ。unique_ptr<T>を に変換することはできませんT*。それらは同じ型ではなく、特にコピーされるときのセマンティクスも同じではありません。unique_ptr<T>これが、 への変換演算子がない理由T*です。T*はクラスではないため、宣言された戻り値の型のサブクラスを返す場合のように、ポリモーフィズムに頼って作業を行うことはできません (実際、unique_ptrのセマンティックの違いは、とにかくサブクラス化が間違った関係になることを意味します) )。

したがって、ここでは選択の余地がありません。a を返しunique_ptr<T>て、呼び出し元に結果を処理させる必要がありunique_ptr<T>ます。これが負担が大きすぎると思われる場合は、スマート ポインターを読んで、スマート ポインターとは何か、またそれらが何をしてくれるのかをよりよく理解することをお勧めします。

shared_ptr<T>より適切なセマンティクスがある可能性があるため、それが正しい種類のスマート ポインター クラスであるかどうかを検討する必要がある場合もあります。

于 2012-05-02T14:32:56.767 に答える
3

私が理解していれば、それcopyHelperは内部機能であり、インターフェースの一部ではありません。その場合、最も簡単な解決策はunique_ptr、生のポインターではなく、署名を返すように変更することです。

別の方法はreleaseunique_ptr内部で呼び出しcopyHelperて所有権を放棄し、呼び出し元がそれを自分で再利用できるようにするunique_ptrことです (そのためには を使用する必要がありますreset)。unique_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 に答える