在课程开始时声明枚举与结束

时间:2016-08-24 18:06:06

标签: c++ class enums

请参考以下2个示例:

struct Coord
{
private:
    enum class Origin
    {
        Top_Left = 0,
        Center
    };
public:
    Coord(Origin origin = Origin::Top_Left) 
    {}
};


int main()
{
}

运行上面这个,我没有错误。另一方面,当我运行它时,我收到以下错误。

struct Coord
{
public:
    Coord(Origin origin = Origin::Top_Left) 
    {}
private:
    enum class Origin
    {
        Top_Left = 0,
        Center
    };
};


int main()
{
}
  

7:16:错误:预期')'在'origin'之前

此外,在Visual Studio 2015中,我在构造函数中找不到标识符Origin的错误。

为什么会这样?

错误: Live Example

1 个答案:

答案 0 :(得分:2)

在第二个示例中,您在声明枚举之前使用枚举。 你需要在第一次使用之前(在构造函数中)声明它,或者在第一次使用之前添加一个前向声明(不会在这里飞行,但在其他情况下会这样)。

编译器需要知道OriginOrigin::Top_LeftCoord(Origin origin = Origin::Top_Left)中使用之前的含义。 记得;编译器从上到下解析您的代码。它需要在使用之前知道的类型。它不会以整体的方式查看整个编译单元。语言就是这样 - “在使用东西之前必须知道什么是东西,我从每个文件的自上而下读取”。有时候“知道的东西”需要是完整的定义,有时候前向声明就足够了(详情不在这个问题的范围内)。