我想知道头文件中以下代码行的含义...
首先,我有一个标准using
,它使命名空间中的类对我的代码可见
using mynamespace::myclass;
然后是同一类的前向声明:
namespace mynamespace
{
class myclass;
}
最后是另一个类的前向声明:
class myclass2;
程序员在“使用”和“前向声明”时的细微差别是什么?编写头文件时哪个更受欢迎?
我想知道头文件中以下代码行的含义...
首先,我有一个标准using
,它使命名空间中的类对我的代码可见
using mynamespace::myclass;
然后是同一类的前向声明:
namespace mynamespace
{
class myclass;
}
最后是另一个类的前向声明:
class myclass2;
程序员在“使用”和“前向声明”时的细微差别是什么?编写头文件时哪个更受欢迎?
为了前向声明类,您不需要using
指令,通常最好在标题中使用完全限定名称:
namespace mynamespace
{
class myclass;
}
class A{
mynamespace::myclass* ptr;
};
此外,正如jrok 所指出的,在符号的实际(前向)声明之前,您不能使用using
将符号带到当前范围。
唯一要做的using
就是使指定的符号在当前范围内可用。它与前向声明无关。
请注意,必须已经声明了指定的符号,因此如果同时使用两者,则必须先转发声明,然后将其带入当前范围。例子:
namespace mynamespace {
class myclass;
}
namespace this_header_namespace {
using mynamespace::myclass;
}
您的第一个选择无效。您只能在前向声明之后给出使用声明
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 放入头文件中的全局范围内。这会将速记引入包含该标题的每个翻译单元,并可能导致名称冲突。