当前位置: 首页 > 知识库问答 >
问题:

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

印辉
2023-03-14

我对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个答案

翟学文
2023-03-14
匿名用户

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。

 类似资料:
  • 问题内容: 我正在从源头解析XML文档,并且它们使用自定义名称空间。 例如。当我使用SimpleXML进行解析时,mostix:名称空间元素均未显示或不可访问。可能是一个非常简单的解决方案,但是有什么想法吗? 问题答案: 通常,人们使用children()。

  • 我有困难建立一个有3个类的结构。我不确定包含/转发声明。 下面的代码一直在编译,直到我在inclino.h中添加名称空间和枚举。我从Inclinomeasure.h收到“Inclino尚未声明”。 倾斜度。h 倾斜度 倾角读数.h 结构正确吗?如何访问其他类中的枚举? 提前道谢。 编辑:我修复了名称空间的问题,把它放在一个新的文件,包括由3类。但我似乎误用了include/forward声明。

  • 在marshall一个JAXB类之后,我有下面的XML: 这个 它可能包含未知数量的具有自己名称空间的其他元素。 问题: 当我马歇尔的一些。类对象,jaxb将另一个的名称空间。类作为ns0导入根元素,因为我得到 这是一个问题,因为 我需要@XmlElementRefs和@XmlElementRef注释,因为我需要从json转换为XML,并且Jackson需要知道“任何”列表可能具有的类型。 我如何

  • 在OpenFOAM中,存在一个函数,其名称为exp,表示数学中的幂操作。同时,C++本身也可以进行这个计算,并且函数名称也为exp。这会导致调用的时候,编译器并不知道应该调用OpenFOAM的exp还是C++本身的exp。一种方法是将其中一个exp函数进行改名,比如将OpenFOAM中的exp改成expFoam。但还有更简单的方式。 名称空间专门用于解决上面的问题,它可作为附加信息来区分不同库中相

  • 下面是我的网站地图的结构: somefile.xml 以下是谷歌的错误信息: 我想我错过了什么,网上的信息很混乱。正确的语法是什么?如果你能帮忙,谢谢。

  • 问题内容: 如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容: 有没有更优雅或更简洁的方法? 问题答案: 我喜欢这个: