我有代码将子类模板声明为私有(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 标准合规性的控诉。但在得出任何结论之前,我想验证一下技术上的正确性。
谢谢。
最佳答案
你的程序对我来说似乎有效(好吧,除了 Y::somethingToDo
是荒谬的私有(private))。 Z::f()
不要求访问任何 private
名字,只有protected
如果Z::f()
试图引用 Y<T>
,那么编译器应该会出错。但是Z::f()
仅访问 _protectedMember
, 这当然是允许的。
关于c++ - 访问私有(private)嵌套类定义的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697045/