为什么我不能使用双冒号前向声明名称空间中的类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)
class Namespace::Class;

为什么我必须这样做?:

namespace Namespace {
    class Class;
}

使用VC ++ 8.0,编译器问题:

错误C2653:'名称空间':不是类或名称空间名称

我认为这里的问题是编译器无法判断Namespace是类还是命名空间?但是,为什么这只是一个前向声明呢?

是否有另一种方法来转发声明在某些名称空间中定义的类?上面的语法感觉就像我“重新打开”命名空间并扩展其定义。如果Class实际上没有定义Namespace呢?这会导致某个点的错误吗?

提问于
用户回答回答于

因为你不能。在C ++语言中,完全限定名仅用于引用现有(即先前声明的)实体。他们不能用来引入新的实体。

实际上是“重启”的命名空间来声明新的实体。如果该类Class稍后被定义为不同名称空间的成员 - 它是一个完全不同的类,与你在此处声明的类无关。

一旦你开始定义预先声明的类,就不需要再次“重新打开”这个命名空间。你可以在全局名称空间(或任何包含你的名称空间Namespace)中将其定义为

class Namespace::Class {
  /* whatever */
};

由于你指的是已经在名称空间中声明的实体,因此Namespace可以使用限定名称Namespace::Class

用户回答回答于

为什么我必须这样做?

你必须这样做,因为该术语Namespace::Class告诉编译器:

...好的,编译器。去找到命名空间命名空间名称空间,并在其中引用名为类的类。

但编译器不知道你在说什么,因为它不知道任何命名空间Namespace。即使有一个命名空间Namespace,如下所示:

namespace Namespace
{
};

class Namespace::Class;

它仍然不起作用,因为你不能在该命名空间之外的命名空间中声明一个类。你必须在命名空间。

所以,你实际上可以在一个名字空间中声明一个类。只要这样做:

namespace Namespace
{
    class Class;
};

扫码关注云+社区