我的代码将子类模板声明为private,然后将成员声明为protected:
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标准合规性的起诉。但在得出任何结论之前,我想验证技术上的正确性。
感谢。
答案 0 :(得分:1)
我很确定我之前见过这个。当时在海湾合作委员会中是known bug,并且已经修复。
答案 1 :(得分:1)
您的程序似乎对我有效(好吧,除了Y::somethingToDo
无意义的私密)。 Z::f()
并未要求访问任何private
个名称,仅限protected
个名称。
如果Z::f()
试图引用Y<T>
,则编译器应该错误。但Z::f()
仅访问_protectedMember
,这肯定是允许的。
答案 2 :(得分:0)
您Y
模板是私有的,不能用于非私有的代码,例如_protectedMember
可以从派生类访问,您也应该将其声明为受保护的,因此其成员对派生类是可见的。
作为一般规则,如果您希望某个范围可以完全访问您的变量,则必须在该范围内完全访问其类型。当然,在以下情况下,您的代码对当前设计非常有用:
class Base {
class PrivateClass {};
protected:
PrivateClass _val;
void doSomething( PrivateClass& v );
}
现在派生类可以使用_val
来调用doSomething
,但是他们无法调用其方法或使用其属性。