Непоследовательное поведение при доступе к определению частного вложенного класса

У меня есть код, который объявляет шаблон подкласса как частный, а затем член как защищенный:

class X {
private:
    template <class T>
    class Y {
    public:
        void somethingToDo();
        // definition
    };
protected:
    Y<SomeType> _protectedMember;
    // More definition
};

class Z : public virtual X{
public:
    void f();
}
void Z::f() {
    ...
    _protectedMember.somethingToDo();
}

Первоначально я скомпилировал это с gcc 4.3.4, и он принял это. Затем я отправил его, чтобы попытаться создать компиляторы GCC, IBM и Microsoft на различных платформах, а компиляторы не-gcc отклонили его. Теперь это кажется обвинением (этой версии) в соответствии стандартам gcc. Но прежде чем я сделаю какие-либо выводы, я хотел бы проверить, что является технически правильным.

Благодарю.

3 ответа

Решение

Ваша программа мне подходит (ну, кроме Y::somethingToDo будучи бессмысленно частным). Z::f() не просит доступа к любому private только имена protected из них.

Если Z::f() пытался ссылаться Y<T>тогда компилятор должен ошибиться. Но Z::f() только доступ _protectedMember, что, безусловно, разрешено.

Я почти уверен, что видел это раньше. В то время это была известная ошибка в GCC, и с тех пор она была исправлена.

Вы Y Шаблон является частным и не может использоваться в кодах, которые не являются частными, как _protectedMember Для того, чтобы быть доступным из производного класса, вы также должны объявить его защищенным, чтобы его член был виден производным классам.

Как правило, если вы хотите, чтобы ваша переменная была полностью доступна для некоторой области, тогда ее тип должен быть полностью доступен в этой области. Конечно, ваш код может быть полезен с текущим дизайном в следующих ситуациях:

class Base {
    class PrivateClass {};
protected:
    PrivateClass _val;
    void doSomething( PrivateClass& v );
}

теперь производные классы могут использовать _val звонить doSomething но они не могут вызывать его методы или использовать его свойства.

Другие вопросы по тегам