C++ 使用命名空间定义函数成员

C++ 使用命名空间定义函数成员,c++,namespaces,language-lawyer,C++,Namespaces,Language Lawyer,我在.h文件中有以下类定义: namespace N { struct S { S(); // no definition for member here }; } 我想在.cpp文件中为类构造函数(一般为成员)编写定义。我认为以下两种情况: 我有点困惑为什么第二种方法是有效的,因为直到今天才看到这种方法的定义。为什么第二个有效?如能引用本标准,将不胜感激 使用一种方法而不是另一种方法的细微差别是什么?我应该选择第一种形式还是第二种形式?之所以(2)

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

namespace N {
    struct S {
        S(); // no definition for member here    
    };
}
我想在
.cpp
文件中为类构造函数(一般为成员)编写定义。我认为以下两种情况:

  • 我有点困惑为什么第二种方法是有效的,因为直到今天才看到这种方法的定义。为什么第二个有效?如能引用本标准,将不胜感激

    使用一种方法而不是另一种方法的细微差别是什么?我应该选择第一种形式还是第二种形式?

    之所以(2)有效,是因为以下两个原因:

  • 如果成员函数的定义在其类之外 定义时,成员函数名称应按其类限定 使用​::​ 接线员

  • (强调矿山)

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


  • 该指令只允许您为
    ::
    操作符命名
    S
    ,就像您在
    N
    名称空间中一样(就像在(1)中一样)。但我不会这么做。范围很好。定义也应该有范围。

    在这个特定示例中,您在名称空间中只声明了一个结构,并在单独的.cpp文件中定义了函数,因此使用1或2并不重要


    如果您在名称空间中声明了任何其他标识符,那么1应该优先于2,因为使用声明有点违背了拥有名称空间的目的。

    如果(2)不起作用,我会感到非常惊讶。显然(1)和一般范围是首选的。@HenriMenke在我看来
    使用名称空间
    是为了“使用”实际上,即调用函数、使用变量等,但不用于定义。例如,不能以相同的方式定义类。是的,但不受限制。“using指令指定的命名空间中的声明在包含using指令的命名空间中可见;”名称空间也可以是转换单元的全局名称空间。我认为对于未命名的名称空间,必须使用第二个版本。
    
    namespace N {
        S::S() { /* definition */ }  
    }
    
    using namespace N;
    S::S() { /* definition */ }