【问题标题】:How to access an C++11 enum class from another file?如何从另一个文件访问 C++11 枚举类?
【发布时间】:2019-02-16 09:54:37
【问题描述】:

我有一个头文件,它最终会包含多个枚举类。但是,当我将头文件包含在另一个文件中并尝试使用 enum 类时,我的程序将无法编译。例如:

枚举.h:

#ifndef ENUMS_H
#define ENUMS_H

enum class TokenType : char
{
     IDEN,
     STRING,
     SEMICO
};

#endif

和 main.cpp:

#include <iostream>
#include "enums.h"

int main()
{
     char token = TokenType::STRING; //Does not compile!
}

但是,当我使用常规枚举时,它可以正确编译:

枚举.h:

#ifndef ENUMS_H
#define ENUMS_H

enum TokenType : char
{
     IDEN,
     STRING,
     SEMICO
}

#endif

和 main.cpp:

#include <iostream>
#include "enums.h"

int main()
{
     char token = STRING; //This does compile!
}

有人知道如何正确执行此操作吗?我搜索了很多,但一无所获。

【问题讨论】:

  • TokenType 不是 char,即使它的基础类型是。它是自己的类型,不会隐式转换。您需要使用正确 (TokenType) 类型的变量或使用显式强制转换。顺便说一句,与旧的enums 相比,这是一件的事情。

标签: c++ c++11 visual-c++ enums


【解决方案1】:

enum class 不参与隐式转换,而无范围枚举则参与。因此,

int main()
{
     TokenType token = TokenType::STRING;
}

将编译。

您可以查看How to automatically convert strongly typed enum into int? 如何将enum class 转换为其他值。

【讨论】:

    【解决方案2】:

    Enum 是强类型,你不能将 enum 分配给 int 或 char 而不强制转换它。 你可以试试:

    int main() 
    {
      char token = (char)TokenType::STRING; 
    }
    

    【讨论】:

    • 如果您必须使用强制转换(总是更喜欢),则首选C++风格强制转换而不是C风格强制转换。在这种情况下static_cast&lt;char&gt;.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多