首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我不能在命名空间中使用双冒号向前声明一个类?

为什么我不能在命名空间中使用双冒号向前声明一个类?
EN

Stack Overflow用户
提问于 2010-01-14 03:41:01
回答 5查看 83.6K关注 0票数 169
class Namespace::Class;

为什么我必须这样做?:

namespace Namespace {
    class Class;
}

使用VC++ 8.0时,编译器会出现以下问题:

错误名称空间:‘C2653’:不是类或命名空间名称

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

是否有其他方法可以向前声明某个名称空间中定义的类?上面的语法感觉就像是在“重新打开”名称空间并扩展它的定义。如果Class实际上不是在Namespace中定义的呢?这会在某一时刻导致错误吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-14 03:46:17

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

实际上,您正在“重新打开”名称空间来声明新的实体。如果Class类后来被定义为不同名称空间的成员-它是一个完全不同的类,与您在此处声明的那个类没有任何关系。

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

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

由于您引用的实体已在命名空间Namespace中声明,因此可以使用限定名称Namespace::Class

票数 86
EN

Stack Overflow用户

发布于 2010-01-14 06:14:32

你得到了正确的答案,让我试着重新措辞:

class Namespace::Class;

为什么我必须这样做?

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

...OK,编译器。找到名为Namespace的名称空间,并在其中引用名为Class的类。

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

namespace Namespace
{
};

class Namespace::Class;

它仍然不能工作,因为您不能在名称空间内从该名称空间外部声明一个类。您必须在名称空间中。

因此,您实际上可以在名称空间中向前声明一个类。只需执行以下操作:

namespace Namespace
{
    class Class;
};
票数 201
EN

Stack Overflow用户

发布于 2010-01-14 06:18:10

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

namespace Company::Communications::Sockets {
}

你必须这样做:

namespace Company {
  namespace Communications {
    namespace Sockets {
    }
  }
}
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2059665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档