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

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

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, что, безусловно, разрешено.

1

Другие решения

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

1

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

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

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

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

0
По вопросам рекламы [email protected]