У меня есть следующий пример кода, который не компилируется:
#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: `classmy :: base1 'недоступен
test.cpp: 17: ошибка: в этом контексте
Теперь я могу догадаться, в чем проблема: при взгляде на объявление print
, компилятор видит base1
и думает: base1
является подобъектом базового класса derived* this
, но у вас нет к нему доступа!Хотя я намерен, чтобы base1
было просто именем типа.
Как я могу увидеть в Стандарте C ++, что это правильное поведение, а не ошибка в компиляторе (я уверен, что это не ошибка; все компиляторы, которые я проверял, вели себя так)?
Как мне исправить эту ошибку?Все следующие исправления работают, но какой из них выбрать?
void print ( class base1 * pointer) {}
void print (:: my :: base1 * указатель) {}
класс base1; пустая печать (base1 * указатель) {}
Изменить:
int main()
{
my::base1 object1;
my::derived object3;
object3.print(&object1);
}