【问题标题】:Using Directives in Implementation Files在实现文件中使用指令
【发布时间】:2015-11-18 06:17:06
【问题描述】:

在 C++ Primer 中,有一个提示说:

using 指令有用的地方是在实现中 命名空间本身的文件。

我猜这只是为了使用简写名称?我不确定它与仅仅围绕实现有什么不同

namespace namespace_name
{
}

谢谢。

【问题讨论】:

    标签: c++ namespaces using


    【解决方案1】:

    这适用于对您自己的命名空间的修改。 using 指令的目的是从 不同的 命名空间导入符号。例如,一个臭名昭著的成语:

    namespace my_stuff
    {
      template <typename Container>
      void my_fn( Container& xs )
      {
        using std::begin;
        using std::end;
        std::sort( begin(xs), end(xs) );
      }
    }
    

    一切都发生在你的my_namespace 中,但如果需要,它可以使用std::begin()std::end() 函数。如果存在更本地化的 begin()end() 定义,与 Container 类型更匹配,则将使用它。如果您只是将所有内容都包装在 std 命名空间中,那么这种有用的功能就会丢失。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我不确定它与仅使用 namespace namespace_name { } 围绕实现有何不同

      这是将您自己的代码放在一个命名空间中,而不是使用来自另一个命名空间的某个名称。假设您在Graphics 命名空间内编写了一个draw 函数——为此,您将draw 的代码包装在namespace Math { void draw() { /* some code */ } } 中并使用它,您可以使用Graphics::draw。但是,当您需要在 Math 命名空间(不是您编写的)中使用函数时,例如 gamma,您必须将其称为 Math::gamma,以便编译器知道在哪里搜索 @987654333 @。或者,您可以使用速记,删除 Math:: 部分。

      我猜这只是为了使用简写名称?

      是的,这是为了允许在没有限定符的情况下使用来自某个命名空间的标识符。有两种方法可以做到。

      1. Using directive:使用命名空间中的所有名称,无需限定(例如using namespace Math;
      2. Using declaration:只使用一些没有限定的指定名称(例如using Math::gamma)——这通常比前者更好。

      但是,我们鼓励它们只在实现/源文件中使用,而不是在标头中使用,以避免某些源可能有自己的 gamma 副本并且不想使用 Math::gamma,但是因为你把它放在标题中,它会导致名称冲突。更多详情请关注"using namespace" in c++ headers

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-10
        • 2021-10-19
        • 2013-10-10
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        相关资源
        最近更新 更多