为什么我无法在赋值中将 unique_ptr 转换为原始指针?

Gar*_*ary 0 c++ smart-pointers c++11

在编写简单的二叉搜索树插入时,在g++ 4.7中遇到编译错误

\n\n
error: cannot convert \xe2\x80\x98node_ptr {aka std::unique_ptr<node>}\xe2\x80\x99 to \xe2\x80\x98node*\xe2\x80\x99 in assignment\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于函数node* n = root.get()中的行bst_insert。我不明白为什么?

\n\n
struct node;\n\ntypedef std::unique_ptr<node> node_ptr;\n\nstruct node {\n        node(int k) : key(k) {};\n        int key;\n        node_ptr left = nullptr;\n        node_ptr right = nullptr;\n};\n\nvoid bst_insert(node_ptr& root, node_ptr z) {\n    node* p = nullptr;\n    node* n = root.get();\n    while (n != nullptr) {\n        p = n;\n        n = z->key < n->key ? n->left : n->right;\n    }\n    if (p == nullptr)\n        root = std::move(z);\n    else if (z->key < p->key)\n        p->left = std::move(z);\n    else p->right = std::move(z);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Gas*_*sim 5

n = z->key < n->key ? n->left : n->right;
Run Code Online (Sandbox Code Playgroud)

这条线。n->left并且n->rightstd::unique_ptrs 并且您正在尝试将唯一的 ptr 分配给原始指针。将该行更改为:

n = z->key < n->key ? n->left.get() : n->right.get();
Run Code Online (Sandbox Code Playgroud)