C++ 在成员函数中使用强类型枚举的成员';s的默认参数
我现在主要使用的是G++和Visual Studio 2015。 我想用VC++2015构建我的项目,但我收到了错误消息,说在一个带有正向声明的强类型枚举的给定默认参数的函数中使用“::”无效 下面是一些代码:C++ 在成员函数中使用强类型枚举的成员';s的默认参数,c++,c++11,visual-c++,visual-studio-2015,strongly-typed-enum,C++,C++11,Visual C++,Visual Studio 2015,Strongly Typed Enum,我现在主要使用的是G++和Visual Studio 2015。 我想用VC++2015构建我的项目,但我收到了错误消息,说在一个带有正向声明的强类型枚举的给定默认参数的函数中使用“::”无效 下面是一些代码: struct Foo { //! Forward declaration of Bar enum class Bar : short; //! "Faulty" function with default argument void DoSmth(Bar
struct Foo
{
//! Forward declaration of Bar
enum class Bar : short;
//! "Faulty" function with default argument
void DoSmth(Bar aBar = Bar::Baz)
{
// ... code ...
}
//! Complete declaration of Bar
enum class Bar : short
{
Baz
};
};
int main() { }
它在使用默认参数Bar::Baz声明函数DoSmth()时给出了以下错误:
test.cpp(7): error C2589: '::': illegal token on right side of '::'
test.cpp(7): error C2059: syntax error: '::'
test.cpp(17): fatal error C1903: unable to recover from previous error(s); stopping compilation
使用G++(使用4.9和5.1测试)时,代码编译得很好,但使用VC++2015时,代码编译得不好
我完全知道在使用前我必须申报一些东西,但是。
只是因为VC++2015没有在类的范围内查找Bar的完整声明和定义,而G++却这样做了吗?
或者,G++是否只是接受完整的声明并将其与转发声明“合并”(因为它们在同一范围内),从而使类完全可用?
或者也许我完全错了,完全不同的原因导致了这一切
我可以接受,我必须更改强类型枚举的所有声明,以使其与VC++2015一起工作
但我也想知道为什么会这样?您的代码是有效的,而VC 14拒绝它是错误的 根据现行标准工作草案[9.2p2]: 类被视为完全定义的对象类型(3.9)(或 在类说明符的结束符
}
处输入完整类型)。在
类成员规范,则该类在
函数体、默认参数、使用声明
继承构造函数(12.9)、异常规范和
非静态数据成员的大括号或同等初始值设定项(包括
嵌套类中的此类内容)。否则将被视为不完整
在它自己的类成员规范中
在默认参数中,查找
Bar::Baz
需要Bar
的完整定义,这在complete类中是可用的,因此一切都很好。现在的一个解决方法是将enum类的完整定义移到调用DoSmith()函数之前
难道没有人知道答案或至少有一个想法吗?最好在你的问题中加入c++
标签;我认为没有它已经大大降低了你问题的可视性。正如答案中所解释的,我认为这是一个bug。你想自己报告还是我来报告?好吧,我想也是这样!非常感谢。