class B
{
public:
    B();
    virtual ~B();
};

class A
{
public:
    using bns = B; // И вот если мы обявим его через using, то начинаются чудеса
private:
    bns* m_Bclass;
public:
    A();
    virtual ~A();

    bns* get_b();
    void set_b(bns* b);
};

A::A()
{
    m_Bclass = nullptr;
}

A::~A()
{
}

void A::set_b(bns* b) // тут всё нормально
{
    m_Bclass = b;
}

A::bns* A::get_b() // а тут error: ‘bns’ does not name a type
{
    return m_Bclass;
}