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

C++ C++;正确使用另一个类中的枚举,c++,c++11,compiler-errors,c++14,C++,C++11,Compiler Errors,C++14,我目前正在使用OpenGL实现一些代码,并为各种OpenGL类创建了包装器。特别是,我有一个buffer类,它可以表示顶点数组缓冲区或元素数组缓冲区。为此,我在标题中声明了我的类,如下所示: Buffer.h namespace FE { namespace GL { enum BufferType { ARRAY = GL_ARRAY_BUFFER, ELEMENT = GL_ELEMENT_ARRAY_BUFFER }; class

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

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.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'不是类型名。”

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


<如何解决这个问题的任何帮助都会被理解。

< P> >枚举没有在C++中创建一个范围。枚举的类型是
FE::GL::BufferType
,但要使用它,只需键入
GL::Buffer vbo(GL::ARRAY)


如果您希望使用范围内枚举(使用C++ 11)使用<代码>枚举类< /COD>

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


如果要使用作用域枚举(使用C++11),请使用
枚举类

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

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

2) 通过默认成员初始值设定项,该初始值设定项只是成员声明中包含的大括号或等于初始值设定项,[…]


包含这些限制是为了避免成员函数声明和默认成员初始值设定项之间的不一致性,请参见建议:(特别是问题1一节)。

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

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

2) 通过默认成员初始值设定项,该初始值设定项只是成员声明中包含的大括号或等于初始值设定项,[…]


包含这些限制是为了避免成员函数声明和默认成员初始值设定项之间的不一致性,请参见建议:(特别是问题1一节)。

您是否试图初始化
vbo
元素
数据成员,或者您正在尝试创建
vbo
element
成员函数?我正在尝试创建数据成员,而不是成员函数。哦,我明白您的意思了。我现在将其更改为:
GL::Buffer vbo=GL::Buffer(GL::ARRAY)非常感谢!您正在尝试初始化
vbo
element
数据成员,还是正在尝试创建
vbo
element
成员函数?我正在尝试创建数据成员,而不是成员函数。哦,我明白您的意思了。我现在将其更改为:
GL::Buffer vbo=GL::Buffer(GL::ARRAY)非常感谢!在C++11和更高版本中,
GL::BufferType::ARRAY
是完全有效的,因为这个问题被标记为C++14,所以这不是问题所在。如果是,我还没有听说过。C++11及更高版本中有关枚举范围的更改有哪些?正如我已经说过的,他们为作用域枚举提供了enum类,但我不知道对普通的旧枚举有什么改变。请参阅(第3.2节)、关于Bjarne的C++11常见问题解答和标准的第7.2/11节(特别是带有
方向的示例)。我必须承认,在当前的标准中很难找到一个好的引用。标准中正确的引用是3.4.3/1:“类或命名空间成员或枚举数的名称可以在::scope解析运算符(5.1)应用于表示其类、命名空间或枚举的嵌套名称说明符之后引用。”和5.1/12:表示枚举(7.2)的嵌套名称说明符,后跟该枚举的枚举数的名称,是引用该枚举数的限定id。结果是枚举数。”(编号来自n4296)在C++11和更高版本中,
GL::BufferType::ARRAY
是完全有效的,因为这个问题被标记为C++14,所以这不是问题。如果是这样的话,我还没有听说过。C++11和更高版本对于枚举的作用域有什么变化?正如我已经说过的,他们为作用域枚举提供了枚举类,但我不知道有什么变化对于普通的旧枚举进行了更改。请参见(第3.2节)、比亚恩的C++11常见问题解答和标准的第7.2/11节(特别是带有
方向的示例)。我必须承认,在当前标准中很难找到一个好的引用。标准中正确的引用是3.4.3/1:“类或命名空间成员或枚举器的名称可以在::scope解析运算符(5.1)应用于表示其类、命名空间或枚举的嵌套名称说明符之后引用。”和5.1/12:“表示枚举(7.2)的嵌套名称说明符,后跟该枚举的枚举器的名称,是引用枚举数的限定id。结果是枚举数。”(编号来自n4296)
namespace FE { namespace Render {
    class Renderer {
    private:
        GL::Buffer vbo{GL::BufferType::ARRAY};
        GL::Buffer element{GL::BufferType::ELEMENT};
    };    
}}