【问题标题】:Enum class defined in header file does not work in struct which is located in another header file?? C++头文件中定义的枚举类在位于另一个头文件中的结构中不起作用? C++
【发布时间】:2021-04-29 16:26:11
【问题描述】:

SomeHeader.h:

enum class TypeEnum
{
    None = 0,
    BYTE,
    UBYTE,
    SHORT,
    USHORT
};

AnotherHeader.h

struct Structure
{
    TypeEnum type;
};

引发错误: C3646 'type': 未知的覆盖说明符

编辑: 似乎没有人知道原因,所以我留下了可能不相关的其他信息:

  1. TypeEnum 在我的真实代码中有 33 个元素
  2. 它位于头文件的顶部
  3. 在其他标题中一切正常
  4. AnotherHeader.h 中使用 TypeEnum 的其他结构不能正常工作
  5. 当我在 AnotherHeader.h 中定义 TypeEnum 时,它说枚举类重新定义应该是这样
  6. 将 TypeEnum 改为 enum 而不是 enum 类不起作用
  7. 其他枚举也不起作用

代码:

SomeHeader.h:

enum class TypeSpec
{
    None = 0,
    BYTE,
    UBYTE,
    SHORT,
    USHORT,
    INT,
    UINT,
    FLOAT,
    DOUBLE,
    VEC2,
    VEC3,
    VEC4,
    VEC2I,
    VEC3I,
    VEC4I,
    VEC2U,
    VEC3U,
    VEC4U,
    VEC2D,
    VEC3D,
    VEC4D,
    MAT2,
    MAT3,
    MAT4,
    MAT2I,
    MAT3I,
    MAT4I,
    MAT2U,
    MAT3U,
    MAT4U,
    MAT2D,
    MAT3D,
    MAT4D
};

另一个Header.h:

struct BufferElement
{
    const char* name;
    TypeSpec type;
    unsigned int size;
    unsigned int offset;
    bool normalized;

    BufferElement() : name("none"), type(TypeSpec::None), size(0), offset(0), normalized(false) {}
    BufferElement(TypeSpec _type, const char* _name, bool _normalized = false) :
        name(_name), type(_type), size(RenderCommand::getTypeComponentCount(type)), offset(0), normalized(_normalized) {}
};

【问题讨论】:

  • 你是否在这个头文件中包含了另一个头文件?
  • 当我在 AnotherHeader.h 中定义枚举类时,它当然可以正常工作,但这有什么问题?
  • 也许在 AnotherHeader.h 中你可以在开头添加:#include "SomeHeader.h"
  • 我这样做了,但没有任何反应
  • 好吧,很遗憾,我无法重现此内容。大概在实际代码中存在一些与您拥有的所有其他枚举类不同的杂散错误,但不可能从这种表示中发现它。

标签: c++ struct enums header


【解决方案1】:

如果你给了我们所有的 AnotherHeader.h,那么包含在哪里?

#include "SomeHeader.h"

我们一直都在这样做。这是微不足道的。在一个标题中定义一些内容,并将其#include 放在您需要的任何其他位置的顶部。哦,您还应该在所有 .h 文件的顶部执行此操作:

#pragma once

这可以防止文件被多次包含。 (它忽略了多次出现。)

所以你的整个 SomeHeader 看起来像:

#pragma once

#include "SomeHeader.h"

struct BufferElement
{
    TypeEnum type;
};

假设你没有用你实际上没有向我们展示的命名空间做奇怪的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2013-06-19
    • 2013-10-15
    相关资源
    最近更新 更多