Непоследовательное поведение при доступе к определению частного вложенного класса
У меня есть код, который объявляет шаблон подкласса как частный, а затем член как защищенный:
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
но они не могут вызывать его методы или использовать его свойства.