除非包含<iostream>,否则'enum struct'将无法编译

时间:2017-08-03 11:15:30

标签: c++11 struct enums include enum-class

我的代码包含

enum struct cols: int8_t {red, blue, green};

当我编译它时,我得到错误:

test.cpp:4:1: warning: elaborated-type-specifier for a scoped enum must not use the 'struct' keyword
 enum struct cols: int8_t {red, blue, green};
 ^
test.cpp:4:13: error: use of enum 'cols' without previous declaration
 enum struct cols: int8_t {red, blue, green};
             ^
test.cpp:4:17: error: expected unqualified-id before ':' token
 enum struct cols: int8_t {red, blue, green};
                 ^

但是,如果我把线

#include <iostream>

在顶部,它没有投诉地编译。

对此有解释吗?

(我使用的是g ++ 4.9.4,但g ++ 5.4.0也显示了这种行为。)

1 个答案:

答案 0 :(得分:1)

std::int8_t不是内置类型。与所有其他精确宽度类型一样,它是内置类型的可选typedef,仅当您的系统具有适当类型的宽度时才会出现。这个和其他可用的std::[u]int*_t类型在<cstdint>中定义。因此,您需要#include <cstdint>

正如我的上一段所示,您还应该指定std::命名空间限定符,因为<c*>标题中的stdlib符号不需要在全局命名空间中可用。

据推测,<iostream>以前通过某种途径间接地包括<cstdint>,但你不应该依赖它;你应该为你使用的每个库符号#include正确的标题。

然后关于struct的事情是由另一个未知基础类型的主要问题引起的红鲱鱼;见Elaborated-type-specifier for a scoped enum must not use the ‘class’ keyword,现在我看到它,几乎与你的问题完全重复。