我在主函数所在的同一文件中写了以下代码段。但是,Visual Studio中的“实时语义错误”功能表示“非静态成员引用必须与特定对象相关”。在我看来,函数m中的x应该是文件范围中定义的int x,它应该可以在这个文件的任何地方访问。
请指出我误解的地方。提前谢谢!
int x = 0;
class Test1{
protected:
char *x;
class Test2{
public:
int m(){
return x++;
}
};
};
答案 0 :(得分:2)
您在此处创建的是nested class:嵌套类的名称存在于封闭类的范围内,并且嵌套类的成员函数的名称查找访问范围在检查嵌套类的范围之后的封闭类。
当您在示例中引用x
中的Test1::Test2::m()
时,编译器将向上移动范围链并找到第一个x
为Test1::x
。因为这不是静态成员变量,所以你会收到错误。
如果您想引用全球x
使用::x
。我修改了你的例子来演示:
#include <stdio.h>
int x = 0;
class Test1{
public:
char *x;
class Test2{
public:
int m(){
return ::x++;
}
};
};
int main() {
printf("x = %d\n", x);
Test1::Test2 foo;
foo.m();
printf("x = %d\n", x);
return 0;
}
打印:
x = 0
x = 1
$ .02关于样式的注释:如果为仅对自己操作的简单数据容器保留嵌套类,这是常见的最佳实践,则不会遇到此问题。