问题描述
class Namespace::Class;
为什么要这样做?:
namespace Namespace {
class Class;
}
使用VC ++ 8.0,编译器会出现问题:
Using VC++ 8.0, the compiler issues:
我假设这里的问题是编译器不能判断 Namespace
是一个类还是一个命名空间?但是为什么这么重要,因为它只是一个向前的声明?
I assume that the problem here is that the compiler cannot tell whether Namespace
is a class or a namespace? But why does this matter since it's just a forward declaration?
有没有另一种方法转发声明一个类在某些命名空间中定义?上面的语法感觉就像我重新打开命名空间并扩展其定义。如果 Class
实际上没有在 Namespace
中定义?这会导致错误吗?
Is there another way to forward-declare a class defined in some namespace? The syntax above feels like I'm "reopening" the namespace and extending its definition. What if Class
were not actually defined in Namespace
? Would this result in an error at some point?
推荐答案
因为你不能。在C ++语言中,完全限定名称仅用于指代现有(即先前声明的)实体。它们不能用于引入新实体。
Because you can't. In C++ language fully-qualified names are only used to refer to existing (i.e. previously declared) entities. They can't be used to introduce new entities.
而且实际上是重新打开声明新实体。如果类 Class
后来被定义为不同命名空间的成员 - 它是一个完全不同的类,与您在此声明的类无关。
And you are in fact "reopening" the namespace to declare new entities. If the class Class
is later defined as a member of different namespace - it is a completely different class that has nothing to do with the one you declared here.
一旦你达到定义预先声明的类,你不需要再次重新打开命名空间。您可以在全局命名空间(或任何包含您的命名空间
)的命名空间中定义为
Once you get to the point of defining the pre-declared class, you don't need to "reopen" the namespace again. You can define it in the global namespace (or any namespace enclosing your Namespace
) as
class Namespace::Class {
/* whatever */
};
因为你是指已经在命名空间中声明的实体
,您可以使用限定名 Namespace :: Class
。
Since you are referring to an entity that has already been declared in namespace Namespace
, you can use qualified name Namespace::Class
.
这篇关于为什么我不能在类似这样的命名空间中声明一个类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!