【问题标题】:C++ Using an enum from another class properlyC ++正确使用另一个类的枚举
【发布时间】:2016-11-10 19:05:44
【问题描述】:

我目前正在使用 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' 不是类型名称。”

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

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

【问题讨论】:

  • 您是要初始化vboelement 数据成员,还是要创建vboelement 成员函数?
  • 我正在尝试创建数据成员,而不是成员函数。
  • 哦,我明白你的意思了。我现在将其更改为:GL::Buffer vbo = GL::Buffer(GL::ARRAY); 非常感谢!

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


【解决方案1】:

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

如果您想要一个作用域枚举(使用 C++11),请使用 enum class

【讨论】:

  • 在 C++11 及更高版本中,GL::BufferType::ARRAY 完全有效,并且由于此问题标记为 C++14,因此这不是问题。
  • 如果是这样,我还没有听说过。 C++11 及更高版本中关于枚举范围的变化是什么?正如我已经说过的,他们为范围枚举提供了枚举类,但我不知道普通旧枚举有什么变化。
  • 参见original proposal(第 3.2 节)、Bjarne 的 C++11 常见问题解答中的 corresponding section 和标准的第 7.2/11 节(特别是 direction 的示例)。我不得不承认,在当前的标准中很难找到一个好的报价。
  • 标准中的正确引号是 3.4.3/1: "在应用 :: 范围解析运算符 (5.1) 之后可以引用类或命名空间成员或枚举器的名称到表示其类、命名空间或枚举的嵌套名称说明符。” 和 5.1/12:“表示枚举的嵌套名称说明符 (7.2),后跟该枚举的枚举数,是指代枚举数的限定 ID。结果是枚举数。"(编号来自 n4296)
【解决方案2】:

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

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

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 部分)。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多