我主要使用G ++,现在使用的是Visual Studio 2015。 我想用VC ++ 2015构建我的项目,但是我收到错误消息,说明在函数中使用'::',在默认参数下使用前向声明的强类型枚举。
以下是一些代码:
visibleViewController
它在函数DoSmth()的声明中给出了以下错误,默认参数为Bar :: Baz:
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() { }
使用G ++(使用4.9和5.1进行测试)代码编译得很好但是VC ++ 2015却没有。
我完全清楚我必须在使用之前申报一些东西但是。 是不是因为VC ++ 2015看起来并不在Bar的完整声明和定义范围内,但是G ++呢? 或许G ++只是采用完整的声明并将其与前向声明“合并”(因为它们在相同的范围内),从而使它完全可用于类? 或者也许我只是完全错了,完全不同的东西导致了这个?
我可以忍受它,我必须更改强类型枚举的所有声明,以使其适用于VC ++ 2015。
但我也想知道为什么会这样?
答案 0 :(得分:2)
您的代码有效,而VC 14拒绝它是错误的。
根据N4527,目前的标准工作草案,[9.2p2]:
一个类被认为是一个完全定义的对象类型(3.9)(或 在类说明符的结束
中}
处完成类型。内 class member-specification ,该类被认为是完整的 函数体,默认参数, using-declarations 介绍 继承构造函数(12.9),异常规范和 brace-or-equal-initializers 用于非静态数据成员(包括 嵌套类中的这类东西)。否则它被认为是不完整的 在其自己的类 member-specification 。
在默认参数中,查找Bar::Baz
需要Bar
的完整定义,这在完整的类中是可用的,所以一切都很好。
答案 1 :(得分:0)
现在可能的解决方法是将enum class
的完整定义移到函数调用之前DoSmith()
。