下面举两个例子:
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
最佳答案
在您的第二个示例中,您在声明枚举之前使用它。 您需要在首次使用之前声明它(在构造函数中)或在首次使用之前添加前向声明(这里不打算飞行,但在其他场景中会)。
编译器需要知道 Origin
和 Origin::Top_Left
在 Coord(Origin origin = Origin::Top_Left)
中使用之前是什么>。
记住;编译器从上到下解析您的代码。在使用它们之前,它需要知道是什么类型。它不以整体的方式查看整个编译单元。该语言就是这样工作的——“在使用东西之前必须知道什么东西是什么,我从每个文件的自上而下阅读”。有时“知道的东西”需要是完整的定义,有时前向声明就足够了(详细信息超出了这个问题的范围)。
关于c++ - 在类(class)开始与结束时声明枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39130205/