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

αλε*_*λυτ 3 c++ namespaces language-lawyer

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

namespace N {
    struct S {
        S(); // no definition for member here    
    };
}
Run Code Online (Sandbox Code Playgroud)

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

  1. namespace N {
        S::S() { /* definition */ }  
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. using namespace N;
    S::S() { /* definition */ }  
    
    Run Code Online (Sandbox Code Playgroud)

我有点困惑为什么第二个工作根本就是因为从来没有看过这种方式直到今天.为什么第二个工作?一些引用标准的人将不胜感激.

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

Sto*_*ica 5

(2)工作的原因是因为这两个:

  1. [class.mfct/4

    如果成员函数的定义在词法定义之外是词法定义,则成员函数名称应使用::运算符通过其类名限定.

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

    using-directive指定指定命名空间中的名称可以在using-directive出现在using-directive之后的范围内使用.在非限定名称查找期间,名称看起来好像是在最近的封闭命名空间中声明的,该命名空间同时包含using-directive和指定的命名空间.[注意:在此上下文中,"包含"表示"直接或间接包含". - 结束说明]

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