在源文件中定义类成员函数时,我们可以使用using namespace ns1::ns2::...::nsx
来避免完全限定函数名。
例如
// Header file - foo.hpp
namespace ns1::ns2 {
class FooClass {
void fooMethod();
}
}
// Source file - foo.cpp
#include "foo.hpp"
using namespace ns1::ns2;
void FooClass::fooMethod() {
// do something
}
但是,最近我在尝试定义全局函数时感到困惑。
请参见以下示例。
// Header file - bar.hpp
namespace ns1::ns2{
void barFunction(); // <-- compile error: undefined reference
}
// Source file - bar.cpp
#include "bar.hpp"
using namespace ns1::ns2;
void barFunction(){
// do something
}
我期望编译器将bar.cpp
中的定义推导为ns1::ns2::barFunction
中定义的bar.hpp
的定义。但这并没有做到。 (如果我在定义中使用完全限定的名称,则一切正常。
这是预期的行为还是我做错了什么?
答案 0 :(得分:3)
这是预期的行为。
[namespace.udir]
3 using指令不会将任何成员添加到声明式 出现的区域。
这意味着在您定义全局命名空间时,barFunction
中没有声明。这使该定义成为此类函数(在全局名称空间中)的第一个也是唯一的声明。
这是设计使然,因为using指令通常可以带来比预期更多的名称。因此,不要踩踏它所在的声明性区域是很好的。