代码之家  ›  专栏  ›  技术社区  ›  αλεχολυτ

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

  •  3
  • αλεχολυτ  · 技术社区  · 7 年前

    我在中有以下类定义 .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 回复  |  直到 7 年前
        1
  •  5
  •   StoryTeller - Unslander Monica    7 年前

    之所以(2)起作用,是因为这两个原因:

    1. [class.mfct]/4

      如果成员函数的定义在其类之外 定义时,成员函数名称应按其类限定 使用::运算符命名。

    2. [namespace.udir]/2 (重点矿山)

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

    该指令只允许您命名 S 对于 :: 操作员,就好像你在 N 命名空间(如(1)中所示)。但我不会那样做。范围界定很好。定义也应确定范围。

        2
  •  0
  •   iambrj    7 年前

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

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