一个关于名字解析的问题
本来感觉自己对c++还是比较熟悉的,看了 <c++primer> 后越来越糊涂了,现在有以下一个问题:
class a
{
public:
a();
static int m1;
public:
void func();
};
int a::m1=0;
void a::func()
{
a::m1=9;//语句1
}
我想,语句1应该是没有错误吧,但是按照c++primer上讲的,在解析a::m1的时候,先解析a,先在函数a::func()所在的局部域里面找a的声明或定义,没找到,然后到外部域(类a的类域)里面找,好的,找到了函数a::a(),现在编译器把a认为是该函数,接着在a上应用::,由于a是函数,应该是出错,但是事实上应该是没错的,怪了??
当然如果写做::a::m1=9,或m1=9按c++primer上讲的都不会出错,前者先从全局域里面找到类a,然后在类a的类域里面找到它的静态成员m1.后者,由于m1在局部域中没申明,所以到外面的域(类域)里面找,同样找到了静态成员m1.
[解决办法]
原因应该是“::”前边的名字,必须作为有效的scope,比如一个名字空间,类(或内部类,联合体,枚举)等来解释,一旦不是,编译立该失败,不再去分辨别的原因,也不再去尝试别的名字。
比如:
#include <iostream>
int main() {
int std;
std::cout < < "Hello World! " < < std::endl;
return 0;
}
将顺利通过而没有问题。
你也可以试试这种代码:
int i;
i::j = 1;
看看编译器报出的错误是啥,是“找不到scope i”,还是“不能在对象i上实施域操作符”。