【发布时间】:2014-07-28 12:07:50
【问题描述】:
我尝试在嵌套名称说明符中使用不完整类型,如下所示:
class A;
int b= A::c; // error: incomplete type ‘A’ used in nested name specifier
class A {
static const int c=5;
};
在 N3797 工作草案的 3.4.3/1 中没有任何说明:
可以引用类或命名空间成员或枚举器的名称 在 :: 范围解析运算符 (5.1) 之后应用于 a 表示其类、命名空间或 枚举
那么行为实现是否依赖于?
【问题讨论】:
-
您引用的部分并没有说您可以在类的前向声明之后使用嵌套名称。
-
@RSahu 名称 A 在使用之前已声明。这意味着这样的名称 using 与引用不矛盾。请注意,名称 A 是在使用之前声明的,如 3.4.1/4 中所述:
A name used in global scope, outside of any function, class or user-declared namespace, shall be declared before its use in global scope. -
应该是A类{ public const int c = 5;};
-
正式来说,这段代码格式不正确不是因为
A不完整,而是因为c这个名字在使用的时候没有声明在A的范围内,所以限定名称查找 (3.4.3) 失败。我想编译器作者认为“类不完整”(因此,没有声明其成员,因此限定名称查找不可能成功)是一个更有帮助的错误消息。
标签: c++ language-lawyer