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 仍然适用。
在 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 仍然适用。