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

万事达

我现在和大多数时候都在使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用类成员作为成员函数的默认参数

来自分类Dev

模板类型的成员枚举类作为函数参数

来自分类Dev

使用默认参数将位掩码作为成员枚举

来自分类Dev

Boost Python使用默认参数包装静态成员函数重载

来自分类Dev

Swift:使用成员常量作为函数参数的默认值

来自分类Dev

默认参数:在非静态成员函数外部无效使用“ this”

来自分类Dev

使用类变量作为类成员函数的默认参数

来自分类Dev

使用类成员函数/变量初始化默认参数

来自分类Dev

检索未命名结构的类型以在成员函数中使用它

来自分类Dev

如何在成员函数中使用隐式类型转换?

来自分类Dev

结构中的默认成员值或默认构造函数参数?

来自分类Dev

在朋友函数中使用成员函数

来自分类Dev

枚举构造函数(创建成员的成员)

来自分类Dev

C++ 多个成员函数定义,基于枚举模板参数

来自分类Dev

C ++ 11:使用非静态成员函数作为类构造函数中的默认参数

来自分类Dev

如何深度复制强类型集合的成员

来自分类Dev

通过参数计数推导重载成员函数的函数参数类型

来自分类Dev

使用指向成员的指针将成员函数作为参数传递

来自分类Dev

如何使用强类型枚举

来自分类Dev

枚举成员值的类型特征

来自分类Dev

枚举成员不是类型错误

来自分类Dev

使用模板参数中的成员类型

来自分类Dev

使用静态成员定义类型参数

来自分类Dev

使用模板参数中的成员类型

来自分类Dev

如何使用模板参数成员的类型?

来自分类Dev

是否可以使用成员函数调用作为默认参数?

来自分类Dev

在开关中使用constexp成员函数

来自分类Dev

何时在成员函数中使用“ this”指针

来自分类Dev

FSM在C ++中使用成员函数指针

Related 相关文章

热门标签

归档