1

在 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++ 嵌套类可访问性

但至少从我读过的答案来看,C++11 在这个问题上与旧版本“不同”的程度还不是很清楚。

从技术上讲,我的问题的解决方案存在于较旧的线程中,例如 Nested class' access to enclosure class' private data members,必须指出这一事实,但它让我看起来很愚蠢。但是我没有得到任何将 C++11 置于上下文中的答案。至少,我认为我的问题不能被公平地视为 C++11 标准之前提出的问题的“重复”。

4

2 回答 2

8

这是cppreference在 C++11 中的变化;

嵌套类中的声明只能使用封闭类中的类型名称、静态成员和枚举数(C++11 前)

嵌套类中的声明可以使用封闭类的任何成员,遵循非静态成员的通常使用规则。(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 中,嵌套类可以引用其封闭类的类型和静态成员。此外,只有将封闭类的对象提供给嵌套类时,它才能引用非静态成员。嵌套类可以访问其封闭类的成员,包括私有成员。

于 2015-01-17T23:46:16.447 回答
1

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

“不,它不被视为类的成员,它只是在它内部的范围内,就像其他任何东西一样。你需要一个 Enclosure 的实例来访问它的成员。”

  • 这和其他几条评论解决了我的代码中的问题。基本上,这对于 C++11 来说仍然适用。
于 2015-01-26T06:53:12.503 回答