C ++正确使用另一个类的枚举

时间:2016-07-08 09:04:58

标签: c++ c++11 compiler-errors c++14

我目前正在使用OpenGL实现一些代码,并且我已经为各种OpenGL类创建了包装器。特别是,我有一个缓冲类,可以表示顶点数组缓冲区或元素数组缓冲区。为此,我在标题中声明了我的类:

Buffer.h

namespace FE { namespace GL {
    enum BufferType {
        ARRAY = GL_ARRAY_BUFFER,
        ELEMENT = GL_ELEMENT_ARRAY_BUFFER
    };

    class Buffer {
    public:
        Buffer(BufferType type);
        ... rest of class ...
    };
}

在我的Renderer类中,我尝试将一些缓冲区实例化为类成员:

Renderer.h

...
#include "../GL/Buffer.h"

namespace FE { namespace Render {
    class Renderer {
    ...
    private:
        GL::Buffer vbo(GL::BufferType::ARRAY);
        GL::Buffer element(GL::BufferType::ELEMENT);
    };    
}}

出于某种原因,尝试以这种方式使用枚举会给我带来错误“语法错误:标识符'ELEMENT'”。 Intellisense还警告“常量'FE :: GL :: ELEMENT'不是类型名称。”

我不太清楚为什么这不起作用,就像以前一样,在测试我的缓冲区相关代码时,我以类似的方式创建缓冲区(通过使用范围运算符访问枚举值)。

如何解决此问题的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

枚举不会在C ++中创建范围。枚举的类型为FE::GL::BufferType但是要使用它,您只需键入GL::Buffer vbo(GL::ARRAY);

即可

如果你想要一个范围的枚举(使用C ++ 11),请使用enum class

答案 1 :(得分:1)

如果您要默认初始化成员,则需要使用大括号{}=

  

非静态数据成员可以通过以下两种方式之一进行初始化:

     

2)通过默认的成员初始化程序,它只是成员声明中包含的大括号或等于初始化程序,[...]

namespace FE { namespace Render {
    class Renderer {
    private:
        GL::Buffer vbo{GL::BufferType::ARRAY};
        GL::Buffer element{GL::BufferType::ELEMENT};
    };    
}}

包含这些限制是为了避免成员函数声明和默认成员初始值设定项之间的不一致,请参阅提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2756.htm(特别是问题1 部分)。