Трудно сказать, в чем проблема, не видя вашего полного источника. Лучший способ отладить подобные проблемы - использовать параметр «-E» в g ++ для получения вывода перед процессором, а затем посмотреть на него, чтобы выяснить, что происходит в ваших включениях. Вот что страница g ++ info говорит о "-E":
-E Останов после стадии предварительной обработки; не запускайте компилятор должным образом.
Выходные данные представлены в виде предварительно обработанного исходного кода, который
отправляется на стандартный вывод.
Кроме того, почему бы просто не включить sys / types.h вверху файла?
Добавление:
В моей системе я создал короткий файл с именем foo.cc, который содержит только:
#include <time.h>
А потом я побежал:
g ++ -E /tmp/foo.cc> /tmp/foo.pp
Очень детально смотреть на этот вывод. Например, я узнал, что /usr/include/bits/types.h имеет typedef для __time_t, и что /usr/include/types.h затем использует этот typedef, чтобы сказать «typedef __time_t time_t». Но есть и другие интересные макросы, окружающие это определение. Обратите особое внимание на такие вещи, как макрос "__BEGIN_NAMESPACE_STD" в /usr/include/time.h, который в моей системе кажется пустым определением. Но я могу себе представить, что некоторые другие системы могут иметь другое значение для этого макроса, заставляя определение time_t в каком-то другом пространстве имен.
Прочитайте информационную страницу Cpp, раздел «9 Вывод препроцессора», который определяет формат строк файла. Особого внимания заслуживает раздел:
Имя исходного файла и информация о номере строки передаются в строках вида
# ФЛАГИ ФИЛЬМА ИМЕНИ
А затем продолжаем описывать «ФЛАГИ», которые представляют интерес для этого уровня отладки.