使用命名空间进行函数成员定义

时间:2017-12-27 09:03:04

标签: c++ namespaces language-lawyer

我在.h文件中有以下类定义:

namespace N {
    struct S {
        S(); // no definition for member here    
    };
}

我想在.cpp文件中为类构造函数(一般成员)编写定义。我考虑以下两种情况:

  1. namespace N {
        S::S() { /* definition */ }  
    }
    
  2. using namespace N;
    S::S() { /* definition */ }  
    
  3. 我有点困惑为什么第二个工作根本没有,因为直到今天才看到这种方式定义。为什么第二个工作?一些引用标准的人将不胜感激。

    使用一种方法而不是另一种方法有什么细微差别?我应该更喜欢第一种还是第二种形式?

2 个答案:

答案 0 :(得分:5)

原因(2)起作用是因为这两个:

  1. [class.mfct]/4

      

    如果成员函数的定义在词法之外是词法上的   定义,成员函数名称应由其类限定   使用::运算符命名。

  2. [namespace.udir]/2(强调我的)

      

    using-directive指定指定命名空间中的名称   可以在using指令出现的范围内使用   使用指令。在非限定名称查找期间,将显示名称   好像它们是在最近的封闭命名空间中声明的   包含using-directive和指定的命名空间。 [ 注意:   在此上下文中,“包含”表示“直接或间接包含”。    - 结束说明]

  3. 该指令只允许您为S运算符命名::,就像您在N命名空间内一样(就像您在(1)中一样)。但我不会这样做。范围很好。定义也应该是范围。

答案 1 :(得分:0)

在这个特定示例中,您在命名空间中只声明了一个结构,并在单独的.cpp文件中定义了该函数,因此如果使用1或2则无关紧要。

如果您在命名空间中声明了任何其他标识符,那么1应优先于2,因为使用声明类型会破坏拥有命名空间的目的。