为什么我不能在这样的名称空间中转发声明一个类?
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 { } } }