我对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
到处都看起来很奇怪。我知道这是一个品味和习惯的问题,但不过。
答案 0 :(得分:10)
当然,当我使用它时,我不想一直输入我的:: vector,所以我想使用命名空间my。但是,我最终可能需要来自std命名空间的东西,然后我想同时使用命名空间std,但这会让我回到初始名称冲突问题。
是的,将带您回到初始名称冲突问题。这就是为什么你应该谨慎使用using namespace ...;
指令,只在源文件中使用,从不在标题中。
不,你不应该。命名空间的发明正是为了避免这种情况。这是否意味着即使我使用命名空间,我仍然应该考虑为我的类型提供非常用名称?
或者使用命名空间是一个错误,我应该总是输入我的:: vector?
如果您愿意,可以使用using namespace ...;
或using ...;
指令,直到发生冲突。这意味着当做发生冲突时,您最终会通过在某些地方明确地对名称进行查询来编写“非自然”代码。
实际上,当您处理短命名空间名称(即std
)时,您可以一直显式地键入它们。大约一个星期后,你甚至都不会注意到你正在打字。
答案 1 :(得分:4)
如果您的代码同时使用std::vector
和my::vector
,则始终将名称全部写为最佳选项。
答案 2 :(得分:0)
如果您要立即再次打开命名空间,为什么还要先把它放在命名空间中?您也可以将该类放在全局命名空间中!
对于那些没有注意到文件顶部的using指令的人来说,这个向量不是std :: vector也会让人很困惑。这本身就是写我的:: vector!
的原因对我来说,看到像std :: vector和std :: list这样的名字实际上提高了可读性,因为我立即知道这些名称的含义。