这个c ++文件......
namespace foo {
class C {
void m();
};
void f();
}
using namespace foo;
void C::m() {}
void f() {}
..使用以下符号编译为目标文件:
$ g++ foo.cpp -c
$ nm foo.o -C
000000000000000a T f()
0000000000000000 T foo::C::m()
为什么C::m()?
会先填充名称空间,而不是f()
?
(我代替using namespace foo
使用namespace foo {...}
,然后这两个名称前缀为foo
。
答案 0 :(得分:12)
在Ember VERSION = '1.5.1';
Ember-Data Version = 1.0.0-beta.6
中,void C::m() {}
是一个限定名称,这样的定义总是指先前声明的内容。编译器查找C::m
,发现C
实际上是C
,这要归功于 using-directive ,它需要foo::C
作为定义void C::m(){}
。
当您编写foo::C::m()
时,它是一个非限定名称,并且它总是在当前命名空间中声明该函数,该命名空间是全局命名空间。