我想知道标题文件中以下代码行的含义......
首先,我有标准的using
,它使我的代码可以看到名称空间中的类
using mynamespace::myclass;
然后是同一个类的前向声明:
namespace mynamespace
{
class myclass;
}
最后是另一个类的前向声明:
class myclass2;
程序员在“使用”和“向前声明”时有什么细微差别?在编写标题文件时哪个更受欢迎?
答案 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
前向声明引入了名称,使用声明引入了该名称的缩写(即,您可以省略名称空间限定)。
使用名字和姓氏进行非正式比喻:首先会介绍一个人,然后才能以名字为基础。
作为指导原则:永远不会将使用声明放入头文件中的全局范围。这会将速记引入包含该标题的每个翻译单元,并可能导致名称冲突。