c++ - 在类(class)开始与结束时声明枚举

标签 c++ class enums

下面举两个例子:

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

最佳答案

在您的第二个示例中,您在声明枚举之前使用它。 您需要在首次使用之前声明它(在构造函数中)或在首次使用之前添加前向声明(这里不打算飞行,但在其他场景中会)。

编译器需要知道 OriginOrigin::Top_LeftCoord(Origin origin = Origin::Top_Left) 中使用之前是什么>。 记住;编译器从上到下解析您的代码。在使用它们之前,它需要知道是什么类型。它以整体的方式查看整个编译单元。该语言就是这样工作的——“在使用东西之前必须知道什么东西是什么,我从每个文件的自上而下阅读”。有时“知道的东西”需要是完整的定义,有时前向声明就足够了(详细信息超出了这个问题的范围)。

关于c++ - 在类(class)开始与结束时声明枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39130205/

相关文章:

c++ - 为什么 C++ STL vector 不会超出范围

Java 泛型 - Class 或 Class<?扩展某些类>

python - 在 Python 中像枚举一样创建 C

java - 枚举 valueOf() 的线程安全

c++ - 如何避免在 QMainWindow 中与过多的 dockwidgets 丑陋重叠?

c++ - deque.resize() 来自 *front*?

c++ - reinterpret_cast/static_cast 和未定义的行为

ruby-on-rails - ruby on rails 中的类变量未初始化错误

具有默认值的 Python defaultdict 类实例化

c# - 接受枚举比较的方法