使用转发定义和命名空间

Forward Definitions and namespace using

本文关键字:命名空间 定义 转发      更新时间:2023-10-16

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

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

using mynamespace::myclass;

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

namespace mynamespace
{
    class myclass;
}

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

class myclass2;

程序员在"使用"和"前向声明"时有什么细微的区别?编写文件时哪个更可取?

您的第一个备选方案无效。您只能在前向声明给出使用声明

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-声明引入了该名称的缩写(即您可以省略命名空间限定)。

与名字和姓氏的非正式类比:首先介绍一个人,然后你才会以名字为基础。

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

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

namespace mynamespace
{
    class myclass;
}
class A{
    mynamespace::myclass* ptr;
};

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

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

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

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