为什么不允许嵌套类的前向声明
Reason for not allowing forward declarations of nested class?
示例:
// can't forward declare with class Foo::Bar
// actual class
class Foo
{
public:
class Bar // or enum Bar
{
}
};
我承认在当前的C++标准下这是不允许的,但我找不出不允许的好理由,尤其是在C++0x中,我们现在可以转发声明枚举了。我想,反对它的论点是,如果我们直接声明嵌套类,结果证明它是私有的,它是不允许的。但这与在命名空间中正向声明一个类,然后将其声明为外部类的嵌套类没有太大区别。编译器只会给出一个错误(可能上一行声明中的错误消息与此声明不匹配(。
那么,为什么它真的不被允许呢?
换句话说(詹姆斯·麦克奈利斯(,"为什么在没有提供Foo或Bar的定义的情况下,类Foo::Bar是不允许的?">
**考虑到C++标准委员会认识到通过在C++0x中引入枚举的前向声明来使用前向声明减少依赖性和编译时间的好处,这肯定是同一件事的一部分,不是吗?
它没有出现在语言中的原因很简单,因为没有人就如何将它包含在语言中提出好的建议。功能不包括它们自己,必须有人写出来并解释其优点,并且没有(或非常小的(缺点。
不正向声明枚举(enum x;
(的参数只是编译器在看到有多少值之前无法为枚举变量选择正确的大小。通过允许您决定编译器(enum x : int;
(,解决了此问题。在进入标准之前,这一点也得到了实施,并被证明是正确的。
请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf
嵌套类肯定可以正向声明:
class Foo
{
public:
class Bar;
};
class Foo::Bar
{
};
如何转发声明嵌套类?为了做到这一点,您必须声明嵌套在其中的类
class ClassName {
您已经开始了一个完整的类声明。不能部分声明类;要么全在这里,要么一个都不在。那么,如果必须完全声明外部类,那么向前声明内部类有什么好处呢?
只有的原因是枚举器的大小是由其枚举器决定的。这就是为什么你必须给它们一个明确的大小来转发声明它们。
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- C++错误:此上下文中不允许使用分解声明
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- C++ 成员声明中不允许使用限定名称
- C++ - 声明结构和类时不允许使用不完整的类型
- 为什么较新版本的C++不允许在类声明中定义纯方法?
- 在友元模板专用化的声明中不允许使用Constexpr
- 为什么函数作用域不允许类前向声明?
- 为什么"constructor-way"在"for-loop"允许但不允许"if-statement"声明变量?
- 定义或重新声明函数内不允许'GetInstance'
- 错误 C2761 不允许成员函数重新声明
- 此处不允许在函数声明之前
- 声明和带有定义的声明.为什么不允许这样做
- basic_string不允许在<TCHAR>声明的位置之外进行定义
- 是否有技术原因不允许using声明以不同的名称访问函数名
- 为什么gcc允许一个没有用户声明的默认构造函数的const对象,而不允许clang
- 函数内部不允许定义或重新声明
- 为什么在声明多维数组时允许省略第一个维度,而不允许省略其他维度?
- xcode 5.1.1抱怨:ISO c++ 11不允许访问声明
- 使用类类型的向量进行前向声明——不允许指向不完整类类型的指针