C++ 访问私有嵌套类定义的行为不一致

C++ 访问私有嵌套类定义的行为不一致,c++,standards,standards-compliance,C++,Standards,Standards Compliance,我的代码将子类模板声明为私有,然后将成员声明为受保护: class X { private: template <class T> class Y { public: void somethingToDo(); // definition }; protected: Y<SomeType> _protectedMember; // More definition }; class Z : p

我的代码将子类模板声明为私有,然后将成员声明为受保护:

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();
}
X类{
私人:
模板
Y类{
公众:
使某事无效;
//定义
};
受保护的:
Y_受保护成员;
//更多定义
};
Z类:公共虚拟X{
公众:
无效f();
}
void Z::f(){
...
_protectedMember.somethingToDo();
}
最初我用GCC4.3.4编译了它,它接受了它。然后我把它发送出去,尝试在各种平台上针对GCC、IBM和Microsoft编译器进行构建,而非GCC编译器拒绝了它。现在,这似乎是对(这个版本的)gcc标准合规性的控诉。但在我得出任何结论之前,我想验证一下什么在技术上是正确的


谢谢。

我肯定我以前看过这个。当时它是GCC中的一个,后来被修复了。

您的程序对我来说似乎是有效的(除了
Y::somethingToDo
是一个荒谬的私有程序)
Z::f()
不要求访问任何
private
名称,只要求访问
protected
名称


如果
Z::f()
试图引用
Y
,则编译器应出错。但是
Z::f()
只访问
\u protectedMember
,这是绝对允许的。

您的
Y
模板是私有的,不能在非私有的代码中使用,例如
\u protectedMember
要从派生类访问,还应该将其声明为protected,因此它的成员对派生类是可见的

一般来说,如果希望变量在某个范围内完全可访问,则其类型必须在该范围内完全可访问。当然,在以下情况下,您的代码对当前设计很有用:

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

现在派生类可以使用
\u val
调用
doSomething
,但它们不能调用它的方法或使用它的属性。

假设你的意思是
Z::f
public
,我的意思是Z::f是public。我来解决这个问题。
Y::somethingToDo
真的应该是私有的吗?
SomeType
似乎没有定义。你能发布一个完整的,最小的,实际的程序来演示这个问题吗?请参阅.FWIW,使用g++4.7和g++4.5编译。听起来很相似,我不确定这是同一个bug,因为在本例中,对受保护成员的访问是正常的。在这种情况下,应该允许或不允许访问类型定义。