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

Rom*_*n L 4 c++ namespaces

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

namespace my
{
    class vector { ... };
}
Run Code Online (Sandbox Code Playgroud)

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

我知道有可能只"导入"我需要的功能using std::set,但在这种情况下,完全导入标准命名空间stdmy命名空间似乎很自然,因为我一直都使用它们.

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


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

And*_*ron 10

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

是的,它会让你回到初始名称冲突问题.这就是为什么你应该using namespace ...;谨慎使用指令,只在源文件中使用,而不是在头文件中.

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

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

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

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

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

  • 理想情况下,如果要使用using指令,则应在功能范围内使用,这样可以轻松跟踪. (5认同)
  • +1表示“您甚至都不会再输入了它”。我已经放弃了在文件作用域中使用“使用名称空间”,而很少使用“使用”指令(仅适用于在整个模块或功能中弹出的标准类型)。 (2认同)