【发布时间】:2015-03-29 11:01:37
【问题描述】:
我对 C++ 不是很熟悉,这是我第一次使用不仅仅是命名空间 std。以下有什么区别?
using MyNameSpace::MyClass;
对
namespace MyNameSpace {class MyClass;}
在两者之后,我现在似乎可以创建一个 MyClass 对象。一种方式比另一种更好吗?另外,如果我不这样做,我是否仍然可以通过在每次需要时在 MyClass 之前附加 MyNameSpace::MyClass 来引用它?
接下来,如果我使用第二个选项转发声明,我还需要#include "MyClass.h"吗?在我(不是很好)的理解中,在 C++ 中,您制作头文件是为了转发声明类,以便以后可以使用它们。那么如果已经前向声明了,还需要包含头文件吗?
最后,当使用多个命名空间(namespace Architecture 和namespace Router)时,我遇到了一个不知道如何解释的错误。在我的一个头文件中,我将using std::vector 作为#include 语句之后的第一行。我认为,此语句不在任何名称空间内。编译时,我收到错误消息“'Architecture::std::vector' 尚未声明”。为了解决这个问题,我可以将语句更改为 using ::std::vector 以告诉它查看 std::vector 的全局范围。
但是,我不明白为什么会出现这个问题。既然我在头文件的顶部声明了using std::vector,为什么我还没有在全局范围内?一个更好的问题可能是:如何判断我在头文件顶部的哪个范围?此外,我认为在 C++ 中(并根据此答案 What is the difference between writing "::namespace::identifier" and "namespace::identifier"?),如果在当前范围内找不到名称,则会自动查找级别,直到达到全局范围。
我希望这些问题写得很好并且易于理解。希望我能得到这些问题的一些答案,并开始了解命名空间之间的交互方式。
【问题讨论】:
-
namespace MyNameSpace {MyClass;}不是合法的 C++,所以我不确定你想在那里做什么。 -
哎呀,对不起。我错过了 class 关键字。
namespace MyNameSpace { class MyClass;} -
您的第三个问题听起来像是您不小心在
Architecture命名空间中包含了一个标准标头,和/或忘记关闭该命名空间。要么就是你自己在Architecture中声明了一个名为std的命名空间或类。检查您的标题是否缺少大括号。 -
我实际上在几乎所有文件中都包含了一堆标准库,例如
#include <vector>。这就是你的意思吗,这就是导致问题的原因吗?
标签: c++ namespaces