c++ - 访问私有(private)嵌套类定义的行为不一致

标签 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 标准合规性的控诉。但在得出任何结论之前,我想验证一下技术上的正确性。

谢谢。

最佳答案

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

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

关于c++ - 访问私有(private)嵌套类定义的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697045/

相关文章:

c++ - 无法重载 glm::vec2 '<' 运算符

c++ - boost::asio::async_read 不断在命名管道上返回 eof

C++(真正)安全的标准字符串搜索?

Azure Policy DeployIfNotExists 无法更改值

html - 当您必须支持 IE6 时,是否可以使用符合 W3C 标准的代码?w3

java - 使用java检查pdf PDF/A-1A时出现iText错误

c++ - "Proper"用VS2010管理文件

c++ - 连接两个std::vector

xml - ]]> 序列在 XML 标记的内容中真的不合法吗?

c++ - 为什么在不专门化类的情况下不允许成员的显式专门化?