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