2010-02-05 34 views
1

我有一个使用命名空间的代码,他们几个,我有我的大脑有些混乱。NameSpaces何时,何地,为什么!

如果我有这样的:

#include <vector> 

protected: 
    vector<registeredObject> mRegistryList; 

编译器抱怨向量有 '无型'

不能我只是这样做:

#include <vector> 

protected: 
    std::vector<registeredObject> mRegistryList; 

或者我需要要做:

using namespace std; 
#include <vector> 

protected: 
    std::vector<registeredObject> mRegistryList; 

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

+0

相关:http://stackoverflow.com/questions/1452721/ – 2010-02-05 04:47:42

回答

1

的第二两种可能性要么将工作。如果你关心,还有一个第三名:

using std::vector; 

protected: 
    vector<registeredObject> mRegistryList; 

其中,using namespace std;一般建议反对 - 它拖了大量的名字,其中一些你基本上可以甚至不知道的,所以它很容易与您自己的代码中的各种事物相冲突。大多数人使用明确的限定名称,例如:大多数时候使用std::vector...版本。

3

我假定上面的代码是一个类的内部。在那种情况下,你想要#2。事实上,你应该避免#3头,这当然是其中的类定义里面居住。否则,当你使用#include这个头文件时,你将非常不满所产生的命名空间冲突。

1

编译器抱怨向量有 “无型”

那是因为没有在全局命名空间称为vector类。而且,由于在定义向量编译器无法找到该类时,您尚未指定任何名称空间。

你的第二个选项是好的。在那里你告诉编译器vecror类位于std命名空间中。

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

1

首先,不要将using namespace置于头文件中,否则包含该头文件的所有文件都将具有全局名称空间中导入的给定名称空间中的所有类型。这会造成很多混乱。

第二件事,在你的最后一个例子中,你在#include之前写了using namespace,而不是全部包括在内。

第三件事,如果你写using namespace std;你不需要完全限定你的std::vector并且可以使用vector

最后,我的偏好是:

  1. 在头文件中,总是使用完全合格的命名空间。
  2. 在源文件中,如果仅使用std名称空间中的一种或两种类型,则可以使用using std::vector;而不是使用完整名称空间。
  3. 在源文件中,您使用std命名空间中的很多类型,请与using namespace std;联系。
0

使用声明或在使用时显式指定名称空间将允许您使用它。我相信你遇到的问题是“受保护的”声明。像“protected”这样的访问说明符只用于类的上下文中。

至于哪一种最好用,使用全局“using”声明一般是不明智的,因为你不需要在“std”命名空间中的所有东西,它会打败拥有首先是一个单独的命名空间,即减少名称冲突的机会。有时,对于将从名称空间使用的对象(比如“using std :: vector;”),使用声明可以使单个声明成为单个中间声明。这不会拖累所有std对象,只是那个特定的对象。但是,即使在这种情况下,如果代码中的任何内容被称为“矢量”,则可能会导致碰撞。通常最好使用明确的规格。

1

使用指令的格式为using namespace some_name;,指南是不应该在函数范围之外使用它们。在函数作用域中使用它们(即使在头文件中定义了该函数时,例如内联或模板)总是很好。

使用声明的格式为using something::something;,指南是不应该在全局范围的标题中使用它们。在你自己的命名空间,类定义或函数范围中使用它们总是很好。

如果您遵循这些准则,您将永远不会有意外的名称歧义问题,并且不会写入包含其他代码的头文件。

相关问题