我现在和大多数时候都在使用Visual Studio 2015和G ++。我想用VC ++ 2015构建项目,但是我收到一条错误消息,提示在给定默认参数的函数中无效使用'::',并且正向声明了强类型枚举。
这是一些代码:
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 ++却在Bar的完整范围内吗?还是G ++只是接受完整的声明,然后将其与正向声明“合并”(因为它们在同一范围内),从而使该类完全可使用?或者,也许我只是错误的,而某些完全不同的原因呢?
我可以忍受它,我必须更改所有用于强类型枚举的声明,才能使其与VC ++ 2015一起使用。
但是我也想知道为什么会这样吗?
您的代码有效,并且VC 14拒绝该代码是错误的。
根据N4527,当前的标准工作草案[9.2p2]:
}
在class-specifier结束时,类被视为完全定义的对象类型(3.9)(或完整类型)。在类成员规范内,该类被视为在函数体,默认参数,使用声明中引入继承的构造函数(12.9),异常规范和非静态数据成员(包括括号或等号初始化程序)的完整类嵌套类中的此类内容)。否则,在其自己的类成员规范内,它被认为是不完整的。
在默认参数中,findBar::Baz
需要完整的定义Bar
,在完整的类中可用,因此一切都很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句