我对C++不太熟悉,这是我第一次使用不仅仅是 namespace std。以下内容有什么区别?

using MyNameSpace::MyClass;


namespace MyNameSpace {class MyClass;}

在这两者之后,似乎现在可以创建MyClass对象。一种方法比另一种更好吗?另外,如果我也不这样做,是否仍可以通过在每次需要时在其前面附加MyNameSpace::MyClass来引用MyClass?

接下来,如果我使用第二个选项转发声明,是否还需要#include "MyClass.h"?以我的理解(不是很好),在C++中,您制作了头文件以便转发声明的类,以便以后使用它们。因此,如果您已经进行了前向声明,是否还需要包括头文件?

最后,当使用多个 namespace (namespace Architecturenamespace Router)时,出现一个错误,我不知道如何解释。在我的一个头文件中,我的using std::vector语句后的第一行是#include。我认为该语句不在任何 namespace 内。编译时,出现错误“未声明'Architecture::std::vector'”。为了解决这个问题,我可以将语句更改为using ::std::vector,以告诉它查看std::vector的全局范围。

但是,我不明白为什么存在此问题。由于我在头文件的顶部声明了using std::vector,为什么我还没有进入全局范围?一个更好的问题可能是:如何分辨头文件顶部的范围?另外,我认为在C++中(根据这个答案What is the difference between writing "::namespace::identifier" and "namespace::identifier"?),如果在当前范围内找不到名称,则将自动查找一个级别,直到达到全局范围为止。

我希望这些问题写得很好并且可以理解。希望我能对这些问题得到一些答案,并开始理解命名空间如何相互影响。

最佳答案

using MyNameSpace::MyClass;

此using-声明将名称MyClass注入(inject)到当前作用域中,引用由MyNameSpace::MyClass表示的实体,该实体必须事先已声明。
namespace MyNameSpace {class MyClass;}

这是 namespace MyClass中类MyNamespace的前向声明。



在第二种情况下,除非您具有using namespace MyNamespace;且可以使用MyClass的完整定义,否则不太可能。



他们做的事情完全不同。



如果using MyNameSpace::MyClass;编译(即已声明MyNameSpace::MyClass),则可以执行此操作。否则,您将无法。



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



这听起来像是缺少括号的问题。如果您编写的 header 没有关闭namespace Architecture,那么您在该 header 之后包含的所有内容都会被意外放入Architecture命名空间中。如果这不是问题,请发布MCVE

关于c++ - 命名空间问题:前向声明和混合命名空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28227939/

10-11 22:44
查看更多