和使用声明作用域相同的类声明在GCC中编译,但不在MSVS中编译

Class declaration in same scope as using declaration compiles in GCC but not MSVS

本文关键字:声明 编译 GCC MSVS 作用域      更新时间:2023-10-16

下面的程序是根据c++标准形成的吗?

namespace X { class A; }
namespace Y { using X::A; class A {}; }
int main() {}

我用不同的编译器得到了不同的结果:

  • gcc编译它没有错误
  • visual c++给出错误C2888:"X::A":不能在命名空间"Y"中定义符号

在c++标准中,我没有发现我的程序违反任何规则。

如果程序格式良好,为什么visual studio会出错?

如果程序格式不好,它违反了c++标准中的什么规则,为什么gcc不给出错误?

我并没有试图编译我的程序。我只是想弄清楚它是否是根据c++标准形成的,以及为什么我测试的两个编译器表现不同。

我认为程序格式不正确。[基本范围声明性]/4说:

给定单个声明性区域中的一组声明,每个声明都指定相同的非限定名称

--它们都应指同一实体,或都指功能和功能模板;或

--只有一个声明应该声明不是typedef名称的类名或枚举名,其他声明都应该引用相同的变量或枚举器,或者都引用函数和函数模板;在这种情况下,类名或枚举名是隐藏的

不限定名称A的两个声明引用了不同的实体,这两个实体都是类。

(有趣的是,GCC 6.0和Clang 3.7似乎都没有这样诊断它。两者都接受编写的代码(没有诊断具有相同名称的两个不同类的声明(。如果将X::A a;添加到main的主体中,则Clang会抱怨X::A的类型不完整。(

不太确定,但您可以尝试以下操作:

namespace X { class A; }
namespace Y 
{
  class X::A {}; 
}
int main() 
{
  return 0;
}