C++ 嵌套名称说明符中的类型不完整
我尝试在嵌套名称说明符中使用不完整类型,如下所示:C++ 嵌套名称说明符中的类型不完整,c++,language-lawyer,C++,Language Lawyer,我尝试在嵌套名称说明符中使用不完整类型,如下所示: 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中没有提及: 可以引用类或命名空间成员或枚举器的名称 在应用于 表示其类、命名空间或名称的嵌套名称说明符 列举 那么这种行为依赖于实现吗?引言 标准中有几个地方暗示您
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中没有提及:
可以引用类或命名空间成员或枚举器的名称
在应用于
表示其类、命名空间或名称的嵌套名称说明符
列举
那么这种行为依赖于实现吗?引言
标准中有几个地方暗示您的代码格式不正确,但下面的引用说明了这一点:
3.3.2p6
声明要点[basic.scope.pdecl]
在类成员声明点之后,可以在其类的范围内查找成员名称
代码的问题不在于试图进入不完整类型的主体内部,而在于只能在声明类成员名后引用它
由于您的转发声明(当然)没有引入任何名为c的成员,因此引用这样的名称是不正确的
误导性的诊断。。。 gcc和clang在输入代码时发出的诊断有点误导,老实说,我觉得一个bug报告已经准备好了
foo.cpp:3:8:错误:嵌套名称说明符中命名的类型“A”不完整
我们被允许在嵌套的名称说明符中命名不完整的类型,但是如上所述;我们不允许提及尚未申报的成员 格式不正确: 法律:
您引用的部分没有说明可以在类的前向声明之后使用嵌套名称。@RSahu名称a是在使用之前声明的。这意味着这样的名称使用与引用不矛盾。注意,如3.4.1/4所述,名称A在使用前已声明:
在全局范围内使用的名称,在任何函数、类或用户声明的命名空间之外,应在其在全局范围内使用前声明。
应为类A{public const int c=5;};从形式上讲,此代码的格式错误并不是因为A
不完整,而是因为名称c
在使用时未在A
的范围内声明,因此限定名称查找(3.4.3)失败。我猜想编译器的作者认为“类是不完整的”(因此,没有声明其成员,因此限定名称查找不可能成功)是一条更有用的错误消息。错误的包含循环也可能导致此问题。检查生成错误的类标题是否错误地包含在给出错误的类中。
class X {
static int a[X::x]; // ill-formed, `X::x` has not yet been declared
static int const x = 123;
};
class X {
int const x = 123;
int a[X::x]; // legal, `X` is incomplete (since we are still defining it)
// but we can still refer to a _declared_ member of it
};