C++ 使用

C++ 使用,c++,header,namespaces,forward-declaration,using-declaration,C++,Header,Namespaces,Forward Declaration,Using Declaration,我想知道头文件中以下代码行的含义 首先,我使用了标准的using,它使命名空间中的类对我的代码可见 using mynamespace::myclass; 然后是同一类的转发声明: namespace mynamespace { class myclass; } 最后是另一类的前向声明: class myclass2; 程序员在“使用”和“向前声明”时的细微差别是什么?编写头文件时,哪个更可取?为了转发声明类,您不需要使用指令,通常最好在头文件中使用完全限定名: namespace

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

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

using mynamespace::myclass;
然后是同一类的转发声明:

namespace mynamespace
{
    class myclass;
}
最后是另一类的前向声明:

class myclass2;

程序员在“使用”和“向前声明”时的细微差别是什么?编写头文件时,哪个更可取?

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

namespace mynamespace
{
    class myclass;
}

class A{
    mynamespace::myclass* ptr;

};

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

使用
的唯一作用是使指定符号在当前范围内可用。它与远期申报无关

请注意,指定的符号必须已声明,因此如果同时使用这两个符号,则必须先向前声明,然后将其放入当前范围。例如:

namespace mynamespace {
    class myclass;
}

namespace this_header_namespace {
    using mynamespace::myclass;
}

您的第一个备选方案无效。只能在转发声明之后给出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声明放入头文件内的全局作用域中。这将在包含该标题的每个翻译单元中引入速记,并可能导致名称冲突。

这些行不能按您在此处列出的顺序出现-限定名称必须指以前声明的实体。差异并不微妙<代码>使用
和转发声明是两件不同的事情。关于您的指导原则,我要添加“在全局范围内”。将名称从一个名称空间拉到另一个名称空间是完全正确的。