2012-03-08 35 views
1

假设我有以下的头文件中定义:命名空间的没有意义对我

namespace MyNamespace 
{ 
    Class global_c; 
} 

然后,我这样做是源文件:

namespace MyNamespace 
{ 
    void MyClass::Function() 
    { 
     ::global_c.DoSomething(); 
    } 
} 

global_c原来为未定义由编译器,如果我只是global_c.DoSomething();然而它编译得很好,如果我添加'使用命名空间MyNamespace';到文件的顶部,它也可以正常工作。

由于global_c与'MyClass'存在于同一个命名空间中,为什么不能仅仅因为'::'被添加到它的前面而被解析呢?

回答

10

因为您明确地通过在::前加上变量来告诉编译器使用全局名称空间。由于global_c不存在于全局名称空间中,因此会引发错误。

编译器正在做你告诉它做的事情。把::想象成Global::

+0

如果这就是它在做什么,那它怎么能找到它呢?它不应该继续下去,因为它在全局命名空间而不是命名空间MyNamespace中寻找它? – tweetypi 2012-03-08 00:13:27

+0

@meds:你是什么意思?如果你在'::'前面加上它肯定是行不通的。如果你不这样做,它会使用当前的namesapce('MyNamespace')。 – 2012-03-08 00:18:59

+0

S我的意思是,如果你在源代码文件中加上'::'并在源文件中使用'namespace MyNamespace',编译器将能够找到变量,这是否意味着当它在全局中查找变量时命名空间它也检查'使用'命名空间,而不仅仅是全局命名空间? – tweetypi 2012-03-08 00:21:38