Проблема понимания shared_ptr - PullRequest
       7

Проблема понимания shared_ptr

1 голос
/ 05 августа 2011

У меня есть:

template<class K,class V>
struct Node
{
node_ptr parent_;//node_ptr is a shared_ptr<Node<K,V>>
node_ptr& get_parent()const
{
return parent_;
}
void set_parent(node_ptr& p)
{
parent_ = p;
}
//the get set for left and right are analogical
};

Я не могу понять, почему это работает:

auto zz = get_parent(get_parent(z));
rb_left_rotate(t,zz);

но это не так:

rb_left_rotate(t,get_parent(get_parent(z)));

по работам я имею в виду, что внутри rb_left_rotate у меня есть:

template<class Tree_T, class Node_T>
void rb_left_rotate(Tree_T& t,Node_T& x)
{
    auto y = get_right(x);
    set_right(x,get_left(y));
    if (get_left(y))
    {
        set_parent(get_left(y),x);
    }
    auto tmp = get_parent(x);
    //y's current parrent is x
    set_parent(y,tmp);//by works I mean that this line WILL NOT set x to empty
......
}

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

rb_left_rotate() принимает Node_T в качестве ссылки на неконстантный. Такая ссылка может быть связана только с l-значением, то есть не временным объектом. auto zz = get_parent(get_parent(z)); создает такое l-значение с именем zz. В выражении rb_left_rotate(t,get_parent(get_parent(z)));, с другой стороны, результатом get_parent(z) является r-значение, то есть временное значение, которое нельзя привязать к ссылке на неконстантное.

Это не связано с тем, что вы используете умный указатель.

0 голосов
/ 05 августа 2011

Какая связь между Node и Node_T?

Почему вы объявляете get_parent функцией-параметром без параметров, но вызываете ее, передавая параметр?

Единственное, что может изменить x - это строка:

set_right(x,get_left(y));

Что делает set_right? 1013 *

В общем, вы, вероятно, получите более предсказуемое поведение, если передадите shared_ptr s как истинные значения, а не ссылки на shared_ptr.

...