首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个关于名字解析的有关问题

2012-02-08 
一个关于名字解析的问题本来感觉自己对c++还是比较熟悉的,看了 c++primer 后越来越糊涂了,现在有以下一

一个关于名字解析的问题
本来感觉自己对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上实施域操作符”。

热点排行