为什么我不能在这样的名称空间中转发声明一个类?

class Namespace::Class; 

为什么我必须这样做?

 namespace Namespace { class Class; } 

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

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

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

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

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

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

一旦你到了定义预先声明的类的地步,你不需要再次“重新打开”这个命名空间。 你可以在全局命名空间(或者命名空间的任何命名Namespace )中定义它

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

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

你得到正确的答案,让我试试重写:

class Namespace::Class;

为什么我必须这样做?

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

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

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

 namespace Namespace { }; class Namespace::Class; 

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

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

 namespace Namespace { class Class; }; 

我想这是出于同样的原因,你不能像这样一次性声明嵌套的命名空间:

 namespace Company::Communications::Sockets { } 

你必须这样做:

 namespace Company { namespace Communications { namespace Sockets { } } }