如何正确使用名称空间以避免名称冲突? 我对正确使用C++命名空间有点困惑。我很清楚它们如何帮助避免冲突(名称冲突),但对于使用关键字的,我就不清楚了。我的意思是,假设我将代码的一部分放入一个名称空间,然后创建一个类,比如 namespace my { class vector { ... }; }

如何正确使用名称空间以避免名称冲突? 我对正确使用C++命名空间有点困惑。我很清楚它们如何帮助避免冲突(名称冲突),但对于使用关键字的,我就不清楚了。我的意思是,假设我将代码的一部分放入一个名称空间,然后创建一个类,比如 namespace my { class vector { ... }; },c++,namespaces,C++,Namespaces,当然,当我使用它时,我不想一直键入my::vector,所以我希望使用名称空间my。但是,我最终可能需要std名称空间中的一些内容,然后我希望同时使用名称空间std,但这将使我回到最初的名称冲突问题 我知道可以只“导入”我需要的功能,比如使用std::set,但在这种情况下,似乎很自然地同时导入标准名称空间std和my名称空间,因为我会一直使用它们 这是否意味着即使在使用名称空间时,我也应该考虑为我的类型指定非通用名称?或者使用名称空间是一个错误,我应该总是键入my::vector?谢谢 嗯,

当然,当我使用它时,我不想一直键入
my::vector
,所以我希望
使用名称空间my
。但是,我最终可能需要
std
名称空间中的一些内容,然后我希望同时
使用名称空间std
,但这将使我回到最初的名称冲突问题

我知道可以只“导入”我需要的功能,比如使用std::set,但在这种情况下,似乎很自然地同时导入标准名称空间
std
my
名称空间,因为我会一直使用它们

这是否意味着即使在使用名称空间时,我也应该考虑为我的类型指定非通用名称?或者
使用名称空间
是一个错误,我应该总是键入
my::vector
?谢谢



嗯,我可能应该澄清一下,这与其说是打字,不如说是可读性的问题。在我看来,到处都是奇怪的东西。我知道这是一个品味和习惯的问题,但无论如何。

如果你的代码同时使用了
std::vector
my::vector
,那么总是完整地写名字是最好的选择

当然,当我使用它时,我不想一直键入my::vector,所以我想使用我的名称空间。然而,我最终可能需要std名称空间中的一些内容,然后我希望同时使用名称空间std,但这将使我回到最初的名称冲突问题

是的,这将使您回到最初的名称冲突问题。这就是为什么您应该使用
使用名称空间指令很少,并且仅在源文件中,而不在头文件中

这是否意味着即使在使用名称空间时,我也应该考虑为我的类型指定非通用名称

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

或者使用名称空间是一个错误,我应该总是键入my::vector吗

如果愿意,可以使用
usingnamespace
使用指令,直到出现冲突。这意味着,当您确实存在冲突时,您将通过在某些地方显式地对名称进行质量认证来编写“非自然”代码


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

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

对于那些没有注意到文件顶部的using指令的人来说,这也会非常混乱,因为该向量不是std::vector。这本身就是编写my::vector的原因


对我来说,看到像std::vector和std::list这样的名字实际上提高了可读性,因为我马上就知道这些名字的意思

“我不想一直键入
my::vector
”为什么不?完全限定名称(或对长名称空间名称使用名称空间别名)有助于使代码更清晰(不必猜测名称来自何处)。它还可以帮助您避免在使用using指令时可能出现的有害名称查找问题(尤其是
使用namespace std;
)。这样的名称查找问题并不经常发生,但一旦发生,就很难诊断,我已经回答了关于堆栈溢出的几个难题,这些问题是由使用名称空间std的
引起的
@James:主要的动机不是打字,而是可读性。也许这是一个品味和习惯的问题,但现在到处都是
真的让我读起来更困难。@James:而且在嵌套名称空间的情况下,情况更糟,
my::db::helpers::class
(随机示例,请不要太认真)在我看来真的很糟糕:)@7vies:你最后一条评论中的问题可以通过
namespace dbhelp=my::db::helpers解决@7vies:它比my_db_helpers_类更容易(因为名称空间别名和使用声明/指令),这是在没有名称空间的可管理代码中得到的。也就是说,我经常希望您可以使用句点而不是双冒号。理想情况下,如果要使用using指令,它应该在函数范围内使用,这样就很容易跟踪。+1表示“您甚至不会注意到您正在键入它。”我已经不再将
使用名称空间
放在文件范围内,而且很少使用
指令键入
(仅适用于在整个模块或函数中弹出的标准类型)。@James:我确实也求助于痛苦的长名称空间!当然,我不会在任何地方都再次打开它,主要是在.cpp文件中,这些名称空间中的类被大量使用,因此这与使它们全局化并不完全相同。我仍然不同意
,因为我发现它们在视觉上太分散注意力了。实际上,我同意@Fred Nurk的观点,即使用句点代替冒号(如在Java/Python/C#中)将非常有用。