请参考以下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
答案 0 :(得分:2)
在第二个示例中,您在声明枚举之前使用枚举。 你需要在第一次使用之前(在构造函数中)声明它,或者在第一次使用之前添加一个前向声明(不会在这里飞行,但在其他情况下会这样)。
编译器需要知道Origin
和Origin::Top_Left
在Coord(Origin origin = Origin::Top_Left)
中使用之前的含义。
记得;编译器从上到下解析您的代码。它需要在使用之前知道是的类型。它不会以整体的方式查看整个编译单元。语言就是这样 - “在使用东西之前必须知道什么是东西,我从每个文件的自上而下读取”。有时候“知道的东西”需要是完整的定义,有时候前向声明就足够了(详情不在这个问题的范围内)。