“使用命名空间”定义全局功能

时间:2019-06-13 11:47:05

标签: c++ namespaces c++17

在源文件中定义类成员函数时,我们可以使用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的定义。但这并没有做到。 (如果我在定义中使用完全限定的名称,则一切正常。

这是预期的行为还是我做错了什么?

1 个答案:

答案 0 :(得分:3)

这是预期的行为。

  

[namespace.udir]

     

3 using指令不会将任何成员添加到声明式   出现的区域。

这意味着在您定义全局命名空间时,barFunction中没有声明。这使该定义成为此类函数(在全局名称空间中)的第一个也是唯一的声明。

这是设计使然,因为using指令通常可以带来比预期更多的名称。因此,不要踩踏它所在的声明性区域是很好的。