提问者:小点点

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


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

using MyNameSpace::MyClass;

VS

namespace MyNameSpace {class MyClass;}

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

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

最后,在使用多个命名空间(命名空间体系结构命名空间路由器)时,我有一个不知道如何解释的错误。在我的一个头文件中,使用std::vector作为#include语句后的第一行。我想,这个语句不在任何名称空间内。编译时,我收到错误,“'architecture::std::vector'没有声明”。为了解决这个问题,我可以使用::std::vector将语句更改为,告诉它查看std::vector的全局范围。

但是,我不明白为什么会存在这个问题。既然我在头文件的顶部使用std::vector声明,为什么我还没有处于全局范围?一个更好的问题可能是:我如何在头文件的顶部辨别我在哪个作用域中?此外,我认为在C++中(根据这个答案,写“::namespace::identifier”和“namespace::identifier”之间有什么区别?),如果在当前范围内找不到名称,您将自动查找一个级别,直到到达全局范围。

我希望这些问题写得很好,可以理解。希望我能得到这些问题的一些答案,并开始理解名称空间是如何彼此交互的。


共1个答案

匿名用户

using MyNameSpace::MyClass;

此using-声明将名称MyClass注入到当前作用域中,引用了MyNamespace::MyClass表示的实体,该实体必须是以前声明过的。

namespace MyNameSpace {class MyClass;}

这是名称空间MyNamespace中的类MyClass的前向声明。

在两者之后,我现在似乎可以创建一个MyClass对象。

在第二种情况下不太可能,除非您有一个使用名称空间myNamespace的并且myClass的完整定义可用。

一种方式比另一种好吗?

他们做完全不同的事情。

另外,如果我都不这样做,我是否还可以通过每次需要时在MyNamespace::MyClass前面添加MyClass来引用MyClass

如果使用MyNamespace::MyClass;编译(即,MyNamespace::MyClass已经声明),那么您可以这样做。否则你就不能。

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

标头通常携带完整的类定义--它包括其所有数据成员和成员函数的声明。像class myclass;这样的前向声明将不允许您创建myclass对象,因为编译器不知道要为该对象分配多少内存,也不知道有哪些构造函数可用。

但是,我不明白为什么会存在这个问题。既然我在头文件的顶部使用std::vector声明,为什么我还没有处于全局范围?一个更好的问题可能是:我如何在头文件的顶部辨别我在哪个作用域中?此外,我还想过在C++中(根据这个答案,写“::namespace::identifier”和“namespace::identifier”之间有什么区别?),如果您在当前范围内找不到名称,您将自动查找一个级别,直到到达全局范围。

这听起来像是牙套缺失的问题。如果您编写的标头没有关闭namespace Architecture,那么您在该标头之后包含的任何内容都将意外地放入Architecture命名空间。如果这不是问题,请贴一个MCVE。