C++如何前向声明仅声明未定义类A的嵌套枚举E?若不可行原因是什么?
类未定义时,无法前向声明其嵌套枚举
核心结论
当类A仅做了声明(比如只写class A;)而未定义时,根本没办法前向声明它内部的嵌套枚举E。
具体原因
C++里,类的声明只是给编译器打个招呼:“有个叫A的类存在”,但完全没透露类的内部结构——包括有没有嵌套枚举、枚举叫什么、底层类型是什么这些细节,编译器一概不知。
而枚举的前向声明,不管是全局的还是嵌套的,都需要编译器明确两个关键信息:一是这个枚举属于哪个作用域,二是它的底层类型(C++11默认是int,也可以显式指定)。但类A没定义的情况下,编译器连A里面有没有E这个枚举都不确定,更没法确认它的作用域归属和类型,自然没法完成前向声明。
你要是硬写这种代码:
class A; enum A::E; // 编译直接报错
编译器肯定会报错,因为此时A是个不完整类型,编译器解析不了它内部的E。
只有等类A完整定义之后,编译器知道了它内部有E这个枚举,你才能对A::E做前向声明——不过这时候直接用A::E就行,前向声明的意义其实不大了。
另外提一句:C++11之后允许前向声明枚举,但前提是枚举的作用域是确定的——比如全局枚举,或者已经定义好的类里的嵌套枚举。对于没定义的类,它的所有内部嵌套类型都是未知状态,编译器根本处理不了相关的前向声明请求。
内容的提问来源于stack exchange,提问作者Vahag Chakhoyan
相关产品推荐
相关产品推荐

