我在.h
文件中有以下类定义:
namespace N {
struct S {
S(); // no definition for member here
};
}
我想在.cpp
文件中为类构造函数(一般成员)编写定义。我考虑以下两种情况:
namespace N {
S::S() { /* definition */ }
}
using namespace N;
S::S() { /* definition */ }
我有点困惑为什么第二个工作根本没有,因为直到今天才看到这种方式定义。为什么第二个工作?一些引用标准的人将不胜感激。
使用一种方法而不是另一种方法有什么细微差别?我应该更喜欢第一种还是第二种形式?
答案 0 :(得分:5)
原因(2)起作用是因为这两个:
如果成员函数的定义在词法之外是词法上的 定义,成员函数名称应由其类限定 使用::运算符命名。
[namespace.udir]/2(强调我的)
using-directive指定指定命名空间中的名称 可以在using指令出现的范围内使用 使用指令。在非限定名称查找期间,将显示名称 好像它们是在最近的封闭命名空间中声明的 包含using-directive和指定的命名空间。 [ 注意: 在此上下文中,“包含”表示“直接或间接包含”。 - 结束说明]
该指令只允许您为S
运算符命名::
,就像您在N
命名空间内一样(就像您在(1)中一样)。但我不会这样做。范围很好。定义也应该是范围。
答案 1 :(得分:0)
在这个特定示例中,您在命名空间中只声明了一个结构,并在单独的.cpp文件中定义了该函数,因此如果使用1或2则无关紧要。
如果您在命名空间中声明了任何其他标识符,那么1应优先于2,因为使用声明类型会破坏拥有命名空间的目的。