Частное наследование: ошибка поиска имени

У меня есть следующий пример кода, который не компилируется:

#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: error: `class my :: base1 ' недоступен

test.cpp: 17: error: внутри этого context

Теперь я могу догадаться, в чем проблема: глядя на объявление print , компилятор видит base1 и думает: base1 - это Подобъект базового класса унаследовал * this , но у вас нет доступа к нему! Хотя я предполагаю, что base1 должно быть просто именем типа.

Как я могу увидеть в стандарте C ++, что это правильное поведение, а не ошибка в компиляторе (я уверен, что это не ошибка; все проверенные мной компиляторы вели себя так)?

Как мне исправить эту ошибку? Все следующие исправления работают, но какое из них выбрать?

void print ( class base1 * pointer) {}

void print ( :: my :: base1 * указатель) {}

class base1; void print (base1 * pointer) {}


Изменить:

int main()
{
    my::base1 object1;
    my::derived object3;
    object3.print(&object1);
}
13
задан curiousguy 18 July 2012 в 05:27
поделиться