为什么在使用namespace指令时没有为函数预先添加名称空间?

时间:2015-05-27 08:21:30

标签: c++ namespaces linkage

这个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

1 个答案:

答案 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()时,它是一个非限定名称,并且它总是在当前命名空间中声明该函数,该命名空间是全局命名空间。