2016-08-24 67 views
0

声明枚举看看下面的两个例子如下:在上课开始VS结束

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: error: expected ')' before 'origin'

此外,在Visual Studio 2015年,我得到了在构造函数中未发现标识Origin错误。

这是为什么?

错误的位置:Live Example

+0

@crashmstr ^相似 –

+0

但根据Bjarne Stoustrup的书第9.4.3节,PPP第4版:编译器不关心类函数和数据成员的顺序;它以您关心的任何顺序呈现声明。一个枚举类是否违反了这个? –

+4

@LogicStuff你可以在C++ 11及更高版本中实际转发declare *强类型枚举* s(“enum class”)。 –

回答

2

在第二个例子中,你正在使用的枚举声明之前。 您需要在第一次使用之前(在构造函数中)声明它或在首次使用之前添加一个前向声明(不会在此处飞行,但会在其他情况下)。

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

+0

我不认为前向声明('enum class Origin;')会做。 “Origin”和“Origin :: Top_Left”都需要可见。 –

+0

你可能是对的 - 听起来似乎合理。我承认我实际上没有检查这种情况。 –

+0

问题部分是'Origin :: Top_Left'。 – Jarod42