我对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”之间有什么区别?),如果在当前范围内找不到名称,您将自动查找一个级别,直到到达全局范围。
我希望这些问题写得很好,可以理解。希望我能得到这些问题的一些答案,并开始理解名称空间是如何彼此交互的。
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。