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

Inconsistent behaviour accessing private nested class definition

本文关键字:不一致 定义 嵌套 访问      更新时间:2023-10-16

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

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荒谬的私有)。 Z::f()没有要求访问任何private名称,只要求访问protected名称。

如果Z::f()试图引用Y<T>,那么编译器应该出错。但是Z::f()只是访问_protectedMember,这肯定是允许的。

我很

确定我以前见过这个。 这是当时GCC中的一个已知错误,此后已得到修复。

Y模板是私有的,不能用于非私有的代码中,例如_protectedMember打算从派生类访问的女巫,您还应该将其声明为受保护,以便其成员对派生类可见。

作为一般规则,如果您希望变量完全可访问某个作用域,则其类型必须在该作用域中完全可访问。 当然,在以下情况下,您的代码对于当前设计很有用:

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

现在,派生类可以使用_val来调用doSomething但它们不能调用其方法或使用其属性。