在类非嵌套类中进行前向声明

问题描述

我遇到了这个奇怪的前向声明(或其他内容),而不是普通的声明:

class A;
class B{
    A* var;
}

你可以做

class B{
   class A* var;
}

现在这可能是一个详细的类型说明符,但是我不确定。 我自己进行了尝试,没有任何问题,甚至使我的代码更加整洁,但我担心它可能会导致我目前不知道的范围界定问题。

有人对此有见识吗?这是有效的正向减速吗?

示例:https://youtu.be/EIptJ0YrYg0?t=412

解决方法

请注意,文档显示:

请注意,详细的名称也可以引入新的类名 类型说明符,它作为另一个声明的一部分出现,但仅 如果名称查找找不到具有相同名称的先前声明的类 名称。

因此,如果类B被包含在命名空间中,并且没有执行先前的A前向声明,则它引用了必须定义的n2::A

,

现在这可能是一个详细的类型说明符,但是我不确定。

是的。实际上,class A;是使用精心设计的类说明符的声明。

但是我担心这可能会导致我目前不了解的范围界定问题

您应该了解的唯一与范围界定有关的一点是,如果是第一次引用精心设计的类型说明符(本身不是声明),则其行为与向其中引入前向声明的行为相同。最近的名称空间或块作用域。例如

namespace N {
  class foo {
     class bar {
       void func(class baz*);
     };
  };
};

...与

相同
namespace N {
  class baz;
  class foo {
     class bar {
       void func(baz*);
     };
  };
};
,

是的,这是有效的前向声明。这就是精心设计的类型说明符。

引用cppreference中的elaborated type specifier

如果名称查找未找到先前声明的类型名称,则通过类,结构或联合(即不是通过枚举)引入elaborated-type-specifier,并且class-name是不合格的标识符,则进行详细说明-type-specifier是类名称的类声明。

即使其名称被非类型声明隐藏,它也可以用于引用已声明的类。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...