和使用声明作用域相同的类声明在GCC中编译,但不在MSVS中编译
Class declaration in same scope as using declaration compiles in GCC but not MSVS
下面的程序是根据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;
}
相关文章:
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 未声明的标识符编译暗黑破坏神 2 程序"muleview"
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 即使不包含其标头,如何成功向前声明的类编译?
- 如何制作 cmakelists.txt编译使用在其他地方声明和实现的函数和类的 CPP
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- Lamda 仅在声明为"自动"时编译,而不是在声明为'bool'时编译
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- C++ SPDLOG 编译错误:变量或字段"set_error_handler"声明为无效
- 在 mingw64- 变量下的窗口中编译 openvpn3 时出错,未在范围内声明
- 尝试编译GoogleTest,但出现以下错误:尚未声明'::OpenThread'
- 如何实现声明功能-C 11,编译时间
- 可变参数模板仅在正向声明时编译
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- 编译错误 在 C++ 上,Calcarea 未在此范围内声明
- 试图过渡到GTK3(针对GTK -3.0库编译)时,在此范围内未声明GTK_Object
- 声明/编译向量中的2d向量
- 需要不完整的类型/正向声明/编译理解
- 使用前向声明编译时"null"?