【发布时间】:2015-09-22 01:59:53
【问题描述】:
以下程序是否符合 c++ 标准?
namespace X { class A; }
namespace Y { using X::A; class A {}; }
int main() {}
我使用不同的编译器得到不同的结果:
- gcc 编译它没有错误。
- visual c++ 给出错误 C2888: 'X::A': symbol cannot be defined in namespace 'Y'
我在 c++ 标准中没有发现我的程序违反的任何规则。
如果程序格式正确,为什么visual studio会报错?
如果程序格式不正确,它违反了c++标准中的什么规则,为什么gcc没有报错?
我不想让我的程序编译。我只是想看看它是否符合 c++ 标准,以及为什么我测试的两个编译器的行为不同。
【问题讨论】:
-
问题标题令人困惑。
X::A和Y::A是两种不同的类型;没有发生“前向声明和后来的定义”。 -
感谢您的建议。我现在改了标题。
-
你试过
using ::X::A吗? -
如果你也将
enum A { FOO };添加到命名空间Y中会更有趣。现在 Clang 编译它,并且 GCC 抱怨A之前已声明。 -
也报告给 GCC :-)
标签: c++ declaration language-lawyer using-declaration