如何正确使用命名空间以避免名称冲突?

时间:2011-02-22 15:40:09

标签: c++ namespaces

我对C ++命名空间的正确使用感到困惑。我很清楚它们如何帮助避免冲突(名称冲突),但是当涉及到using关键字时,它就不再清楚了。我的意思是,假设我将一部分代码放入命名空间,并创建一个类,比如说

namespace my
{
    class vector { ... };
}

当然,当我使用它时,我不想一直输入my::vector,所以我想using namespace my。但是,我最终可能需要std命名空间中的某些东西,然后我同时想要using namespace std,但这会让我回到初始名称冲突问题。

我知道可以“导入”我需要的功能,例如using std::set,但在这种情况下,导入标准名称空间std和{{1}似乎很自然完全命名空间,因为我一直都在使用它们。

这是否意味着即使我使用命名空间,我仍然应该考虑为我的类型提供非常用名称?或者my是一个错误,我应该总是输入using namespace?感谢。


好吧,我应该澄清一下,这更像是一个可读性而不是打字的问题。很多my::vector到处都看起来很奇怪。我知道这是一个品味和习惯的问题,但不过。

3 个答案:

答案 0 :(得分:10)

  

当然,当我使用它时,我不想一直输入我的:: vector,所以我想使用命名空间my。但是,我最终可能需要来自std命名空间的东西,然后我想同时使用命名空间std,但这会让我回到初始名称冲突问题。

是的,带您回到初始名称冲突问题。这就是为什么你应该谨慎使用using namespace ...;指令,只在源文件中使用,从不在标题中

  

这是否意味着即使我使用命名空间,我仍然应该考虑为我的类型提供非常用名称?

不,你不应该。命名空间的发明正是为了避免这种情况。

  

或者使用命名空间是一个错误,我应该总是输入我的:: vector?

如果您愿意,可以使用using namespace ...;using ...;指令,直到发生冲突。这意味着当发生冲突时,您最终会通过在某些地方明确地对名称进行查询来编写“非自然”代码。

实际上,当您处理短命名空间名称(即std)时,您可以一直显式地键入它们。大约一个星期后,你甚至都不会注意到你正在打字。

答案 1 :(得分:4)

如果您的代码同时使用std::vectormy::vector,则始终将名称全部写为最佳选项。

答案 2 :(得分:0)

如果您要立即再次打开命名空间,为什么还要先把它放在命名空间中?您也可以将该类放在全局命名空间中!

对于那些没有注意到文件顶部的using指令的人来说,这个向量不是std :: vector也会让人很困惑。这本身就是写我的:: vector!

的原因

对我来说,看到像std :: vector和std :: list这样的名字实际上提高了可读性,因为我立即知道这些名称的含义。