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)有效,是因为以下两个原因:
该指令只允许您为
::
操作符命名S
,就像您在N
名称空间中一样(就像在(1)中一样)。但我不会这么做。范围很好。定义也应该有范围。在这个特定示例中,您在名称空间中只声明了一个结构,并在单独的.cpp文件中定义了函数,因此使用1或2并不重要
如果您在名称空间中声明了任何其他标识符,那么1应该优先于2,因为使用声明有点违背了拥有名称空间的目的。如果(2)不起作用,我会感到非常惊讶。显然(1)和一般范围是首选的。@HenriMenke在我看来
使用名称空间是为了“使用”实际上,即调用函数、使用变量等,但不用于定义。例如,不能以相同的方式定义类。是的,但不受限制。“using指令指定的命名空间中的声明在包含using指令的命名空间中可见;”名称空间也可以是转换单元的全局名称空间。我认为对于未命名的名称空间,必须使用第二个版本。
namespace N {
S::S() { /* definition */ }
}
using namespace N;
S::S() { /* definition */ }