Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在成员函数中使用强类型枚举的成员';s的默认参数_C++_C++11_Visual C++_Visual Studio 2015_Strongly Typed Enum - Fatal编程技术网

C++ 在成员函数中使用强类型枚举的成员';s的默认参数

C++ 在成员函数中使用强类型枚举的成员';s的默认参数,c++,c++11,visual-c++,visual-studio-2015,strongly-typed-enum,C++,C++11,Visual C++,Visual Studio 2015,Strongly Typed Enum,我现在主要使用的是G++和Visual Studio 2015。 我想用VC++2015构建我的项目,但我收到了错误消息,说在一个带有正向声明的强类型枚举的给定默认参数的函数中使用“::”无效 下面是一些代码: struct Foo { //! Forward declaration of Bar enum class Bar : short; //! "Faulty" function with default argument void DoSmth(Bar

我现在主要使用的是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一起工作


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

您的代码是有效的,而VC 14拒绝它是错误的

根据现行标准工作草案[9.2p2]:

类被视为完全定义的对象类型(3.9)(或 在类说明符的结束符
}
处输入完整类型)。在 类成员规范,则该类在 函数体、默认参数、使用声明 继承构造函数(12.9)、异常规范和 非静态数据成员的大括号或同等初始值设定项(包括 嵌套类中的此类内容)。否则将被视为不完整 在它自己的类成员规范中


在默认参数中,查找
Bar::Baz
需要
Bar
的完整定义,这在complete类中是可用的,因此一切都很好。

现在的一个解决方法是将
enum类的完整定义移到调用
DoSmith()函数之前

难道没有人知道答案或至少有一个想法吗?最好在你的问题中加入
c++
标签;我认为没有它已经大大降低了你问题的可视性。正如答案中所解释的,我认为这是一个bug。你想自己报告还是我来报告?好吧,我想也是这样!非常感谢。