5

以下程序是否符合 c++ 标准?

namespace X { class A; }

namespace Y { using X::A; class A {}; }

int main() {}

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

  • gcc 编译它没有错误。
  • visual c++ 给出错误 C2888: 'X::A': symbol cannot be defined within namespace 'Y'

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

如果程序格式正确,为什么Visual Studio会报错?

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

我不是想让我的程序编译。我只是想找出它是否符合 c++ 标准,以及为什么我测试的两个编译器的行为不同。

4

2 回答 2

4

我认为该程序格式不正确。[basic.scope.declarative]/4 说:

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

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

— 恰好一个声明应声明一个不是 typedef 名称的类名或枚举名,而其他声明应全部引用相同的变量或枚举数,或全部引用函数和函数模板;在这种情况下,类名或枚举名是隐藏的

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

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

于 2015-07-04T12:31:47.390 回答
-2

不太确定,但你可以尝试这样的事情:

namespace X { class A; }

namespace Y 
{
  class X::A {}; 
}

int main() 
{
  return 0;
}
于 2015-07-04T11:44:56.893 回答