Частное наследование: ошибка поиска имени - PullRequest
13 голосов
/ 12 апреля 2011

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

#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);
}

1 Ответ

12 голосов
/ 12 апреля 2011

Раздел, который вы ищете - 11.1. Для решения этой проблемы предлагается использовать :: my :: base1 *:

[Примечание. В производном классе при поиске имени базового класса будет найдено имя введенного класса вместо имени базового класса в области, в которой он был объявлен. Имя введенного класса может быть менее доступным, чем имя базового класса в области, в которой оно было объявлено. - конец примечания]

[ Example:
class A { };
class B : private A { };
class C : public B {
A *p;
// error: injected-class-name A is inaccessible
:: A * q ;
// OK
};
...