【问题标题】:Usage of members of a strongly typed enum in a member function's default arguments在成员函数的默认参数中使用强类型枚举的成员
【发布时间】:2015-07-29 21:22:01
【问题描述】:

我主要使用 G++,现在使用 Visual Studio 2015。 我想用 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++ 却可以吗? 或者,也许 G++ 只是采用完整的声明并将其与前向声明“合并”(因为它们在同一范围内),从而使其对类完全可用? 或者也许我只是完全错了,完全不同的原因导致了这个?

我可以忍受我必须更改所有强类型枚举的声明才能使其与 VC++2015 一起使用。

但我也想知道这是为什么?

【问题讨论】:

  • 没有人知道答案或至少有一个想法吗?
  • 在您的问题中包含c++ 标签是个好主意;我认为没有它大大降低了您的问题的知名度。
  • 正如答案中所解释的,我认为这是一个错误。您是要自己举报,还是我应该举报?

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


【解决方案1】:

你的代码是有效的,VC 14 拒绝它是错误的。

根据N4527,当前标准工作草案,[9.2p2]:

一个类被认为是一个完全定义的对象类型(3.9)(或 完整类型)在类说明符的结束}。内 class member-specification,该类被认为是完整的 函数体、默认参数、使用声明 继承构造函数 (12.9)、exception-specificationsbrace-or-equal-initializers 用于非静态数据成员(包括 嵌套类中的此类内容)。否则视为不完整 在它自己的类中成员规范

在默认参数中,查找Bar::Baz 需要Bar 的完整定义,它在完整的类中可用,所以一切都很好。

【讨论】:

  • 好吧,这和我想的一样!谢谢!
【解决方案2】:

也许目前的解决方法是将enum class 的完整定义移到函数调用之前DoSmith()

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多