在成员函数的默认参数中使用强类型枚举的成员

时间:2015-07-29 21:22:02

标签: c++ c++11 visual-c++ visual-studio-2015 strongly-typed-enum

我主要使用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。

但我也想知道为什么会这样?

2 个答案:

答案 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()