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

Nested class member access on C++11

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

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

即使这样也不能使用 g++4.7.2 和 -std=c++11 进行编译,产生这种形式的错误消息:

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

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

更新:

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

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

之前类似的相关讨论引用了C++11中的一些"updates",例如C++ nested classes accessibility

但不是很清楚,至少从我读过的答案来看,C++11 在这个问题上与旧版本的 "different" 完全不同。

从技术上讲,我的问题的解决方案存在于较旧的线程中,例如 Nested class' access to enclosing class' private data members,一个必须指出的事实,无论它让我看起来多么空洞。但是我没有得到任何将 C++11 置于上下文中的答案;至少,我认为我的问题不能被公平地视为 "duplicate" 在 C++11 标准之前提出的问题。

这是 C++11 中对 cppreference;

的更改

Declarations in a nested class can use only type names, static members, and enumerators from the enclosing class (until C++11)

Declarations in a nested class can use any members of the enclosing class, following the usual usage rules for the non-static members. (since 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 中,嵌套的 class 可以引用其封闭 class 的类型和静态成员。此外,只有当封闭 class 的对象被赋予嵌套 class 时,它才能引用非静态成员。嵌套 class 可以访问其封闭 class 的成员,包括私有成员。

为了结束这个问题,我将以此作为答案:

"No, it's not treated as a member of the class, it's just scoped inside of it like anything else. You'll need an instance of Enclosing to access it's members."

  • 这条评论和其他几条评论解决了我的代码中的问题。基本上这对 C++11 仍然适用。