'enum struct' не будет компилироваться, если ‹iostream› не включен

У меня есть код, содержащий строку

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.)


person user1479670    schedule 03.08.2017    source источник


Ответы (1)


std::int8_t не является встроенным типом. Как и все другие типы с точной шириной, это необязательный typedef для встроенного типа, присутствующий только в том случае, если в вашей системе есть соответствующий тип этой ширины. Этот и другие доступные типы std::[u]int*_t определены в <cstdint>. Поэтому вам нужно #include <cstdint>.

Как указано в абзаце выше, вы также должны указать квалификатор пространства имен std::, поскольку символы stdlib в заголовках <c*> не обязательно должны быть доступны в глобальном пространстве имен.

Предположительно, <iostream> ранее каким-то образом косвенно включало <cstdint>, но на это полагаться не следует; вы должны #include указать правильный заголовок для каждого библиотечного символа, который вы используете.

Тогда то, что касается struct, является отвлекающим маневром, возникающим из-за другой, основной проблемы неизвестного основного типа; см. Уточненный-спецификатор-типа для перечисления с ограниченной областью действия не должно использоваться ключевое слово «класс» , которое теперь, когда я смотрю на него, является почти точной копией вашего вопроса.

person underscore_d    schedule 03.08.2017