在源文件中定义类成员函数时,我们可以使用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
中的定义推导出为bar.hpp
中定义的ns1::ns2::barFunction
的定义。但它没有这样做。(如果我在定义中使用完全限定的名称,一切正常(。
这是预期的行为还是我做错了什么?
预期行为。
这意味着在定义全局命名空间[命名空间.udir]
3 using-指令不会向声明性添加任何成员 它出现的区域。
时,全局命名空间中没有 barFunction
的声明。这使得该定义成为此类函数的第一个也是唯一一个声明(在全局命名空间中(。
这是设计使然,因为 using 指令通常可以引入比预期更多的名称。因此,不让它践踏它出现的声明性区域是好的。