命名空间问题:向前声明和混合命名空间

我对C ++不是很熟悉,这是我第一次使用不仅仅是名字空间std。 以下是什么区别?

using MyNameSpace::MyClass;

VS

namespace MyNameSpace {class MyClass;}

在两者之后,似乎我现在可以创建一个MyClass对象。 比其他方式更好吗? 另外,如果我不这样做,每次我需要时,我还可以通过在MyNameSpace :: MyClass之前添加MyClass来引用MyClass吗?

接下来,如果我使用第二个选项转发声明,是否还需要#include "MyClass.h" ? 在我的(不是很好)的理解中,在C ++中,为了转发声明类,您可以创建头文件,以便稍后使用它们。 所以如果你已经宣告了,你还需要包含头文件吗?

最后,在使用多个名称空间( namespace Architecturenamespace 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;}

这是名称空间MyNamespaceMyClass的前向声明。

在两者之后,似乎我现在可以创建一个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。

链接地址: http://www.djcxy.com/p/29771.html

上一篇: Namespace questions: forward declaration and mixing namespaces

下一篇: Legacy standard C library headers and overloaded C++ functions