转发定义和命名空间使用

时间:2013-09-16 09:41:18

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

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

首先,我有标准的using,它使我的代码可以看到名称空间中的类

using mynamespace::myclass;

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

namespace mynamespace
{
    class myclass;
}

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

class myclass2;

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

3 个答案:

答案 0 :(得分:2)

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

namespace mynamespace
{
    class myclass;
}

class A{
    mynamespace::myclass* ptr;

};

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

答案 1 :(得分:2)

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

请注意,必须已经声明了指定的符号,因此如果您同时使用这两个符号,则必须先转发声明,然后将其置于当前作用域中。例如:

namespace mynamespace {
    class myclass;
}

namespace this_header_namespace {
    using mynamespace::myclass;
}

答案 2 :(得分:2)

您的第一个选择无效。您只能在前向声明

之后提供使用声明
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

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

使用名字和姓氏进行非正式比喻:首先会介绍一个人,然后才能以名字为基础。

作为指导原则:永远不会将使用声明放入头文件中的全局范围。这会将速记引入包含该标题的每个翻译单元,并可能导致名称冲突。