在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标准之前提出的一个问题。
答案 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实例来访问它的成员。”