嵌套名称说明符中的不完整类型

Incomplete type in nested name specifier

本文关键字:类型 说明符 嵌套      更新时间:2023-10-16

我尝试在嵌套名称说明符中使用不完整类型,如下所示:

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)之后嵌套名称说明符,表示其类、名称空间或枚举

行为实现依赖吗?

简介

在标准中有几个地方暗示你的代码是病态的,但是下面的引用说明了一切:

3.3.2p6 声明点 [basic.scope.pdecl]

在类成员声明点之后,可以在其类的作用域内查找成员名。

你的代码的问题不在于你试图到达不完整类型的内部,问题在于你只能在声明之后引用类成员名

由于你的前向声明(当然)没有引入任何名为c的成员,引用这样的名称是错误的。


误导性诊断…

gccclang在输入你的代码时发出的诊断有些误导,老实说,我觉得一个bug报告是合适的。

foo.cpp:3:8: error: incomplete type 'A' named in nested name specifier

允许嵌套名称说明符中命名不完整类型,但是如上所述;不允许引用尚未声明的成员。

不规范的:

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
};

当访问一个类的成员变量时,我得到了相同的错误,该成员变量已在头文件中向前声明,但未包含在我访问它的主程序中。

myClass.h

class FowardInclude; // has member "int x", but only forward-declared here
class MyClass {
public:
    void foo(int num);
}

main.cpp

#include "forwardInclude.h" // <-- This is the line I was missing
#include "myClass.h"
MyClass m;
m.foo(ForwardInclude::x);