【问题标题】:Forward Definitions and namespace using转发定义和命名空间使用
【发布时间】:2024-01-08 06:06:01
【问题描述】:

我想知道 header 文件中以下代码行的含义...

首先我有标准的using,它使命名空间中的类对我的代码可见

using mynamespace::myclass;

然后是同一个类的前向声明:

namespace mynamespace
{
    class myclass;
}

最后是另一个类的前向声明:

class myclass2;

程序员在“使用”和“前向声明”时的细微差别是什么?编写 header 文件时哪个更受欢迎?

【问题讨论】:

  • 这些行不能按照您在此处列出的顺序出现 - 限定名称必须引用先前声明的实体。
  • 差异并不微妙。 using 和前向声明是两个不同的东西。

标签: c++ header namespaces forward-declaration using-declaration


【解决方案1】:

您的第一个选择无效。您只能在 前向声明之后给出 using 声明

namespace N { class C; } // OK, now we know that N::C exists

using N::C;              // OK, now we can type C whenever we mean N::C

前向声明引入了名称,使用声明引入了该名称的缩写(即,您可以省略命名空间限定)。

名字和姓氏的非正式类比:首先会介绍一个人,然后才能根据名字获得。

作为准则:切勿将 using-declarations 放入头文件中的全局范围。这会将速记引入包含该标题的每个翻译单元,并可能导致名称冲突。

【讨论】:

  • 关于您的指导方针,我会添加“在全球范围内”。将名称从一个命名空间拉到另一个命名空间是非常好的。
【解决方案2】:

为了前向声明类,你不需要using 指令,通常最好在标题中使用完全限定名:

namespace mynamespace
{
    class myclass;
}

class A{
    mynamespace::myclass* ptr;

};

另外,正如jrok 所指出的,在符号的实际(前向)声明之前,您不能使用using 将符号带到当前范围。

【讨论】:

    【解决方案3】:

    using 唯一要做的就是使指定符号在当前范围内可用。它与前向声明无关。

    请注意,指定的符号必须已经声明,因此如果您同时使用两者,则必须先转发声明,然后将其带入当前范围。示例:

    namespace mynamespace {
        class myclass;
    }
    
    namespace this_header_namespace {
        using mynamespace::myclass;
    }
    

    【讨论】:

      最近更新 更多