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

Dan*_*und 9 c++ namespaces linkage

这个c ++文件......

namespace foo {
    class C {
        void m();
    };
    void f();
}

using namespace foo;

void C::m() {}
void f() {}
Run Code Online (Sandbox Code Playgroud)

..使用以下符号编译到目标文件:

$ g++ foo.cpp  -c
$ nm foo.o  -C
000000000000000a T f()
0000000000000000 T foo::C::m()
Run Code Online (Sandbox Code Playgroud)

为什么要C::m()?预先添加命名空间,但不是f()

(II代替using namespace foo使用,namespace foo {...}然后两个名字都有foo前缀).

T.C*_*.C. 12

void C::m() {},C::m是一个限定名称,这样的定义总是指先前声明的东西.编译器查找C,发现C实际上foo::C,由于using指令,它需要void C::m(){}作为定义foo::C::m().

在编写时void f() {},这是一个非限定名称,它总是在当前命名空间中声明该函数,该命名空间是全局命名空间.