Несмотря на то что классы друзья, он не могут получить доступ к привату друг друга

если поменять struct на class у Banka то в Odpisok вылезет куча ошибок(), несмотря на то что Banka это друг Odpisok'а, если же сделать Odpisok классом а не структурой, при этом там написано паблик везде тоесть приватка только у поля, то move тоже вылезет ошибка что очень странно, не понимаю как это так происходит

#pragma once
#include <iostream> 
using std::ostream;
template <typename I>
class Odpisok;

template <typename I>
struct Banka
{
    I x;
    Odpisok<I> next;
    Banka()
    {
        x = 0;
        next = 0;
    }
    Banka(I a,const Odpisok<I>& b)
    {
        x = a;
        next = b;
    }
    ~Banka()
    {
    }
public:
    friend Odpisok<I>;
};

template <typename I>
struct Odpisok
{
    Banka<I>* a = 0;
 public:
    friend Banka<I>;
    Odpisok()
    {}
    Odpisok(I x)
    {
        Odpisok<I> b;
        a = new Banka<I>(x, b);
    }
    Odpisok(const Odpisok& b)
    {
        a = b.a;
    }
    Odpisok& operator =(const Odpisok& b)
    {
        this->a = b.a;
        return *this;
    }
    Odpisok& operator =(void* b)
    {
        try
        {
            if (b == 0)
                this->a = 0;
            else
                throw "сюда это нельзя";
        }
        catch (const char* a)
        {
            std::cout << a;
        }
        return *this;
    }
    const bool operator ==(const Odpisok& b) const
    {
        return (a == b.a);
    }
    const bool operator !=(const Odpisok& b) const
    {
        return (a != b.a);
    }
    const bool operator ==(void* b) const
    {
        try
        {
            if (b == 0)
                return (a == b);
            else
                throw "сюда это нельзя";
        }
        catch (const char* a)
        {
            std::cout << a;
        }
        return false;
    }
    const bool operator !=(void* b) const
    {
        try
        {
            if (b == 0)
                return (a != b);
            else
                throw "сюда это нельзя";
        }
        catch (const char* a)
        {
            std::cout << a;
        }
        return false;
    }
    const bool plov() const
    {
        return (a == 0);
    }
    I inf() const
    {
        return a->x;
    }
    Odpisok& Next() const
    {
        return a->next;
    }
    void move()
    {
        a = (a->next).a;
    }
    const Odpisok& poiskel(const Odpisok& s=Odpisok()) const
    {
        if (a->next != s)
            return (a->next).poiskel(s);
        else
            return *this;
    }
    void addk(I y)
    {
        if (a == 0)
        {
            Odpisok v(y);
            *this = v;
        }
        else
        {
            Odpisok u (poiskel());
            Odpisok c(y);
            u.a->next = c;
        }
    }
    void delk()
    {
        Odpisok u(poiskel());
        if (u.a == a)
            a = 0;
        else
        {
            Odpisok e(poiskel(u));
            e.a->next = 0;
        }
            delete u.a;
    }
    void deletelka()
    {
        if (a != 0)
        {
            delk();
            deletelka();
        }
    }
    ~Odpisok()
    {
    }
    friend ostream& operator << (ostream& w, const Odpisok& x);
};

Ответы (0 шт):