命名空间问题:向前声明和混合命名空间
我对C ++不是很熟悉,这是我第一次使用不仅仅是名字空间std。 以下是什么区别?
using MyNameSpace::MyClass;
VS
namespace MyNameSpace {class MyClass;}
在两者之后,似乎我现在可以创建一个MyClass对象。 比其他方式更好吗? 另外,如果我不这样做,每次我需要时,我还可以通过在MyNameSpace :: MyClass之前添加MyClass来引用MyClass吗?
接下来,如果我使用第二个选项转发声明,是否还需要#include "MyClass.h"
? 在我的(不是很好)的理解中,在C ++中,为了转发声明类,您可以创建头文件,以便稍后使用它们。 所以如果你已经宣告了,你还需要包含头文件吗?
最后,在使用多个名称空间( namespace Architecture
和namespace Router
)时,我有一个错误,我不知道如何解释。 在我的一个头文件中,我using std::vector
作为我的#include
语句后的第一行。 我认为这个陈述不在任何命名空间内。 编译时,我收到错误,“'Architecture :: std :: vector'尚未声明”。 为了解决这个问题,我可以将语句更改为using ::std::vector
来告诉它查看std::vector
全局范围。
但是,我不明白为什么存在这个问题。 因为我在头文件的顶部声明using std::vector
,为什么我还没有在全局范围内? 一个更好的问题可能是:我怎么知道我处于头文件顶部的范围? 此外,我想在C + +(并根据这个答案写作“::命名空间::标识符”和“命名空间::标识符”之间的区别是什么?),如果你不能找到当前范围内的名称,你会自动查找一个级别,直到达到全球范围。
我希望这些问题写得很好,可以理解。 希望我能得到这些问题的一些答案,并开始理解命名空间是如何相互影响的。
using MyNameSpace::MyClass;
此使用声明将名称MyClass
注入到当前作用域中,引用由MyNameSpace::MyClass
表示的实体,该实体必须先前已声明。
namespace MyNameSpace {class MyClass;}
这是名称空间MyNamespace
类MyClass
的前向声明。
在两者之后,似乎我现在可以创建一个MyClass
对象。
第二种情况不太可能,除非你有一个using namespace MyNamespace;
并且MyClass
的完整定义可用。
比其他方式更好吗?
他们做了完全不同的事情。
另外,如果我不这样做,每次我需要时,我还可以通过在MyNameSpace::MyClass
之前添加MyClass
来引用MyClass
吗?
如果using MyNameSpace::MyClass;
编译(即MyNameSpace::MyClass
已被声明),那么你可以这样做。 否则,你不能。
接下来,如果我使用第二个选项转发声明,是否还需要#include "MyClass.h"
? 在我的(不是很好)的理解中,在C ++中,为了转发声明类,您可以创建头文件,以便稍后使用它们。 所以如果你已经宣告了,你还需要包含头文件吗?
头文件通常带有完整的类定义 - 包括所有数据成员和成员函数的声明。 像class MyClass;
的前向声明class MyClass;
将不允许你创建一个MyClass
对象,因为编译器不知道要为该对象分配多少内存或哪些构造函数可用。
但是,我不明白为什么存在这个问题。 因为我在头文件的顶部声明使用std :: vector,为什么我还没有在全局范围内? 一个更好的问题可能是:我怎么知道我处于头文件顶部的范围? 此外,我想在C + +(并根据这个答案写作“:: namespace ::标识符”和“名称空间::标识符”?之间的区别是什么,如果你不能找到当前范围内的名称,你会自动查找一个级别,直到达到全球范围。
这听起来像是缺少大括号的问题。 如果您编写的头文件没有关闭namespace Architecture
,那么您在该头文件之后包含的任何内容都将无意中放入Architecture
名称空间中。 如果这不是问题,请发布一个MCVE。
上一篇: Namespace questions: forward declaration and mixing namespaces
下一篇: Legacy standard C library headers and overloaded C++ functions