Я стараюсь реализовать linked_ptr
. Это учебная задача. Это часть моего кода:Почему метод класса не имеет доступа к некоторому полю моего класса?
template <class T>
class linked_ptr
{
public:
//***************
linked_ptr<T>(linked_ptr<T> const& other)
{
p = other.p;
left_ptr = &other;
right_ptr = other.right_ptr;
if (other.right_ptr != nullptr)
{
(other.right_ptr)->left_ptr = this;
}
other.right_ptr = this;
}
template <class U>
linked_ptr<T>(linked_ptr<U> const& other)
{
p = other.p;
left_ptr = &other;
right_ptr = other.right_ptr;
if (other.right_ptr != nullptr)
{
(other.right_ptr)->left_ptr = this;
}
other.right_ptr = this;
}
private:
T *p;
mutable linked_ptr const* left_ptr;
mutable linked_ptr const* right_ptr;
};
class A
{
public:
int a = 0;
A(int aa)
{
a = aa;
}
};
class B : public A
{
public:
B(int bb)
{
a = bb;
}
};
int main()
{
linked_ptr<B> a(new B(5));
linked_ptr<A> b(a);
return 0;
}
У меня есть некоторые ошибки:
cannot access private member declared in class 'smart_ptr::linked_ptr<B>'
cannot access private member declared in class 'smart_ptr::linked_ptr<B>'
cannot access private member declared in class 'smart_ptr::linked_ptr<B>'
cannot access private member declared in class 'smart_ptr::linked_ptr<B>'
cannot access private member declared in class 'smart_ptr::linked_ptr<B>'
cannot access private member declared in class 'smart_ptr::linked_ptr<B>'
ptr::linked_ptr<B> *' to 'const smart_ptr::linked_ptr<A> *'
ptr::linked_ptr<B> *' to 'const smart_ptr::linked_ptr<A> *'
linked_ptr<A> *const ' to 'const smart_ptr::linked_ptr<B> *'
linked_ptr<A> *const ' to 'const smart_ptr::linked_ptr<B> *'
Я не знаю, что связаны эти ошибки. Интересно, что linked_ptr<T>(linked_ptr<T> const& other)
хорошо работает, но linked_ptr<T>(linked_ptr<U> const& other)
нет.
Как исправить эти проблемы? Могу ли я объединить два конструктора копий в один?
P.S. Конечно, U
- ребенок T
.
Обычно такие ошибки выдают номер строки; это очень поможет, если вы укажете * где * эти ошибки происходят в вашем коде. – Hurkyl
@Hurkyl, все ошибки встречаются в 'linked_ptr (linked_ptr const & other)'. –
Denis