使用转发定义和命名空间
Forward Definitions and namespace using
我想知道头文件中以下代码行的含义...
首先,我有标准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;
}
相关文章:
- 在命名空间中定义函数还是限定函数
- 使用命名空间时出现多个定义错误
- 如何对命名空间限定类型进行类型定义?
- C++未定义的命名空间
- 命名空间更改函数定义
- 使用命名空间在另一个".cpp"文件中定义
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在方法定义中显式指定命名空间
- 在命名空间中定义变量
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 在 c++ 中使用类的命名空间定义类的成员
- cgo调用C++中定义的函数(位于命名空间中)
- 在内联命名空间中扩展最初在内联命名空间的封闭命名空间中定义的命名空间
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- 自定义提升前缀/命名空间 - 如何使用
- C++最佳实践 - 在多个命名空间中定义类
- 共享库中使用"使用命名空间"定义的符号错误
- C++:在'#include <files>'之前是否允许命名空间定义。
- 命名空间定义和异常