首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NameSpaces何时、何地、为什么!

NameSpaces何时、何地、为什么!
EN

Stack Overflow用户
提问于 2010-02-05 12:38:56
回答 6查看 314关注 0票数 1

我有使用名称空间的代码,其中有几个,我的大脑中有一些混乱。

如果我有类似这样的东西:

代码语言:javascript
复制
#include <vector>

protected:
    vector<registeredObject> mRegistryList;

编译器抱怨向量没有类型

我就不能这么做吗:

代码语言:javascript
复制
#include <vector>

protected:
   std::vector<registeredObject> mRegistryList;

或者我需要做的是:

代码语言:javascript
复制
using namespace std;
#include <vector>

protected:
    std::vector<registeredObject> mRegistryList;

使用多个名称空间的正确方法是什么,等等?

EN

回答 6

Stack Overflow用户

发布于 2010-02-05 12:44:46

我假设上面的代码是在一个类中。在这种情况下,您需要#2。实际上,您应该避免在头部中使用#3,这当然是类定义所在的位置。否则,当您对头文件执行#include操作时,您将会对由此产生的名称空间冲突感到非常不安。

票数 3
EN

Stack Overflow用户

发布于 2010-02-05 12:43:58

后两种可能性中的任何一种都会起作用。如果你关心的话,还有第三个:

代码语言:javascript
复制
using std::vector;

protected:
    vector<registeredObject> mRegistryList;

其中,using namespace std;通常被建议不要使用--它会拖入大量的名称,其中一些您根本不知道,所以它很容易与您自己的代码中的各种东西发生冲突。大多数人使用显式限定名称,比如:std::vector...版本。

票数 1
EN

Stack Overflow用户

发布于 2010-02-05 12:44:46

编译器抱怨向量没有类型

这是因为在全局名称空间中没有名为vector的类。由于您在定义向量时没有指定任何名称空间,因此编译器无法找到该类。

你的第二个选择很好。在这里,您告诉编译器vecror类驻留在std名称空间中。

在第三个选项中,mRegistryList的定义中的std::是不必要的,因为您已经通过using std;语句包含了名称空间。我觉得using语句污染了名称空间(尤其是在头文件中使用时),所以我更喜欢第二种选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2205080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档