我对C++不太熟悉,这是我第一次使用不仅仅是 namespace std。以下内容有什么区别?
using MyNameSpace::MyClass;
与
namespace MyNameSpace {class MyClass;}
在这两者之后,似乎现在可以创建MyClass对象。一种方法比另一种更好吗?另外,如果我也不这样做,是否仍可以通过在每次需要时在其前面附加MyNameSpace::MyClass来引用MyClass?
接下来,如果我使用第二个选项转发声明,是否还需要
#include "MyClass.h"
?以我的理解(不是很好),在C++中,您制作了头文件以便转发声明的类,以便以后使用它们。因此,如果您已经进行了前向声明,是否还需要包括头文件?最后,当使用多个 namespace (
namespace Architecture
和namespace 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/