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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用命名空间进行函数成员定义相关的知识,希望对你有一定的参考价值。

我在.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 */ }

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

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

答案

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

  1. [class.mfct]/4 如果成员函数的定义在词法定义之外是词法定义,则成员函数名称应使用::运算符通过其类名限定。
  2. [namespace.udir]/2(强调我的) using-directive指定指定命名空间中的名称可以在using-directive出现在using-directive之后的范围内使用。在非限定名称查找期间,名称看起来好像是在最近的封闭命名空间中声明的,该命名空间同时包含using-directive和指定的命名空间。 [注意:在此上下文中,“包含”表示“直接或间接包含”。 - 结束说明]

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

另一答案

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

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

以上是关于使用命名空间进行函数成员定义的主要内容,如果未能解决你的问题,请参考以下文章

命名空间

命名空间

命名空间

命名空间:不只是代码封装

C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性

namespace 命名空间