C ++ 11上的嵌套类成员访问

时间:2015-01-17 19:37:08

标签: c++ c++11 g++-4.7

在C ++ 11中,我试图通过以下方式从嵌套类访问封闭类的成员变量:

struct Enclosing {
    int a;
    struct Nested {
        int f() {
            return a;
        }
    };
};

即使没有使用带有-std = c ++ 11的g ++ 4.7.2进行编译,也会产生以下形式的错误消息:

error: invalid use of non-static data member 'Enclosing::a'

据我所知,C ++ 11将嵌套类视为类的成员,因此可以说嵌套类可以访问封闭类的每个其他成员。我做错什么了吗?提前谢谢。

更新

虽然我的问题似乎在下面有一个答案,但我不相信这会被标记为重复。

在发布问题之前经过大量搜索之后,我知道在C ++ 11标准之前讨论了嵌套类和封闭类之间的关系。

之前的相关讨论引用了一些"更新"在C ++ 11中,例如C++ nested classes accessibility

但不是很清楚,至少从我已经阅读过的答案中可以看出,C ++ 11的全部范围是"不同的"从这个问题的旧版本。

从技术上讲,我的问题的解决方案存在于较旧的线程中,例如 Nested class' access to enclosing class' private data members,这是一个必须指出的事实,但无论如何它让我看起来如此。但是,我没有得到任何将C ++ 11置于背景中的答案;至少,我不认为我的问题可以被公平地认为是重复的#34;在C ++ 11标准之前提出的一个问题。

2 个答案:

答案 0 :(得分:7)

以下是来自cppreference;

的C ++ 11中的变化
  

嵌套类中的声明只能使用类型名称static   封闭类的成员和枚举器(直到C ++ 11)

     

嵌套类中的声明可以使用封闭的任何成员   class,遵循非静态成员的通常使用规则。   (自C ++ 11起)

int x,y; // globals
class enclose { // enclosing class
    int x; // note: private members
    static int s;
 public:
    struct inner { // nested class
        void f(int i) {
            x = i; // Error: can't write to non-static enclose::x without instance
            int a = sizeof x; // Error until C++11,
                              // OK in C++11: operand of sizeof is unevaluated,
                              // this use of the non-static enclose::x is allowed.
            s = i;   // OK: can assign to the static enclose::s
            ::x = i; // OK: can assign to global x
            y = i;   // OK: can assign to global y
        }
        void g(enclose* p, int i) {
            p->x = i; // OK: assign to enclose::x
        }
    };
};

简而言之,在C ++ 11中,嵌套类可以引用其封闭类的类型和静态成员。此外,只有当封闭类的对象被赋予嵌套类时,它才能引用非静态成员。嵌套类可以访问其封闭类的成员,包括私有成员。

答案 1 :(得分:0)

要结束这个问题,我会以此作为答案:

“不,它不被视为该类的成员,它只是在其他任何内容的范围内。你需要一个Enclosing实例来访问它的成员。”

  • 这个和其他几条评论解决了我的代码中的问题。基本上这对于C ++ 11来说仍然是正确的。