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

时间:2012-10-02 19:36:12

标签: c++ standards standards-compliance

我的代码将子类模板声明为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标准合规性的起诉。但在得出任何结论之前,我想验证技术上的正确性。

感谢。

3 个答案:

答案 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,但是他们无法调用其方法或使用其属性。