У меня есть следующий пример кода, который не компилируется:
#include <stdio.h>
namespace my
{
    class base1
    { // line 6
    };
    class base2: private base1
    {
    };
    class derived: private base2
    {
    public:
        // The following function just wants to print a pointer, nothing else!
        void print(base1* pointer) {printf("%p\n", pointer);}
    };
}
Ошибка, которую печатает gcc:
test.cpp: 6: ошибка: `class my:: base1 ' недоступен
test.cpp: 17: ошибка: внутри этого контекст
Теперь я могу догадаться, в чем проблема: при просмотре объявления print компилятор видит base1 и думает: base1 является подобъектом базового класса derived* this, но вы не знаете, У меня есть доступ к нему! Хотя я предполагаю, что base1 должен быть просто именем типа.
Как я могу видеть в стандарте С++, что это правильное поведение, а не ошибка в компиляторе (я уверен, что это не ошибка, все компиляторы, которые я проверил, вели себя так)?
Как мне исправить эту ошибку? Все следующие исправления работают, но какой из них выбрать?
void print ( класс base1 * указатель) {}
void print (:: my:: указатель base1 *) {}
класс base1;void print (base1 * pointer) {}
Edit:
int main()
{
    my::base1 object1;
    my::derived object3;
    object3.print(&object1);
}