Доступ к открытым статическим членам базового класса, указанным как частный

Я изучаю С++. В документации docs.microsoft.com/en-us/cpp/cpp/member-access-control-cpp говорится:

Когда вы указываете базовый класс как закрытый, он затрагивает только нестатические члены. Публичные статические члены все еще доступны в производных классах.

Однако следующий код слегка скорректирован из примера, следующего за предыдущим цитатой, вызывает ошибку C2247:

'Base:: y' недоступен, потому что 'Derived1' использует 'private' для наследования с 'Base'.

Я буду признателен за любую помощь в этой ситуации.

class Base
{
public:
    int x;             
    static int y;      
};

class Derived1 : private Base
{
};

class Derived2 : public Derived1
{
public:
    int ShowCount();    
};

int Derived2::ShowCount()
{
    int cCount = Base::y;       
    return cCount;
}

Ответ 1

Эта документация немного вводит в заблуждение.

Правильное поведение компилятора для Base::y и Base::x для обоих недоступно в Derived, если вы используете эту нотацию, чтобы попытаться достичь члена static.

Но вы можете связаться с ним через глобальное пространство имен (тем самым обходя Derived1), используя другой оператор разрешения области:

int Derived2::ShowCount()
{
    int cCount = ::Base::y;       
    return cCount;
}

Наконец, не забудьте определить y где-нибудь, если вы хотите, чтобы этап ссылки был успешным.

Ответ 2

Измените это:

Base::y;

::Base::y;