Why can#39;t I forward-declare a class in a namespace using double colons?(为什么我不能使用双冒号在命名空间中前向声明一个类?)
问题描述
class Namespace::Class;
为什么我必须这样做?:
Why do I have to do this?:
namespace Namespace {
class Class;
}
使用VC++ 8.0,编译器问题:
Using VC++ 8.0, the compiler issues:
错误 C2653:命名空间":不是类或命名空间名称
error C2653: 'Namespace' : is not a class or namespace name
我认为这里的问题是编译器无法判断 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.
一旦你到了定义预先声明的类的地步,你就不需要再次重新打开"命名空间了.您可以在全局命名空间(或包含 Namespace
的任何命名空间)中将其定义为
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
中声明的实体,因此您可以使用限定名称 Namespace::Class
.
Since you are referring to an entity that has already been declared in namespace Namespace
, you can use qualified name Namespace::Class
.
这篇关于为什么我不能使用双冒号在命名空间中前向声明一个类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么我不能使用双冒号在命名空间中前向声明一个类?
基础教程推荐
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01