Один из способов отследить такие ошибки - начать с нуля:
#include "filepath/ui.h"
int main () { return 0; }
Это компилируется?(Это хорошо работает с небольшим фрагментом ui.h, который вы предоставили.)
Подобные ошибки часто бывают вызваны отсутствующей точкой с запятой в каком-либо предыдущем объявлении класса.Итак, давайте попробуем форсировать проблему:
struct Foo { int foo; } // Note the missing semicolon after the close brace.
#include "filepath/ui.h"
int main () { return 0; }
Это, конечно, не компилируется чисто.Я получаю запутанную трассировку пути включения из моего testmain.cpp в ваш filepath / ui.h в строку ... и в итоге получаю
/usr/include/i386/_types.h:37: error: two or more data types in declaration of '__int8_t'
Так что это не ошибка, но пропущенная точка с запятой навернякасоздавая беспорядок.Ваша ошибка не возникает глубоко в недрах <string>
, поэтому давайте сделаем нашу тестовую программу #include <string>
перед попыткой воссоздать ошибку:
#include <string>
struct Foo { int foo; } // Note the missing semicolon after the close brace.
#include "filepath/ui.h"
int main () { return 0; }
И сообщение об ошибке будет
In file included from testmain.cpp:5:
filepath/ui.h:6: error: expected unqualified-id before 'namespace'
И вот оно.Поэтому некоторые другие заголовки, которые вы #include перед filepath / ui.h, имеют неправильно сформированное объявление класса.
Приложение
Иногда это помогает использовать другой компилятор.g ++ печально известен своей плохой обработкой этой распространенной ошибки программирования.Компиляция вышеупомянутого с выходом clang
testmain.cpp:4:2: error: expected ';' after struct
Итак, tada, clang сосредоточился на проблеме.
Что происходит, когда компилятор сталкивается с проблемой, он применяет некоторые исправления к вашемукод, чтобы сделать его грамматически правильным.Сообщение об ошибке компилятора основано на этой автокоррекции.Обратите внимание: эта автокоррекция вообще очень хорошая вещь.Без этого компилятор обязательно должен был бы завершить работу при первой ошибке.Так как программисты неизбежно допускают более одной ошибки, выискивать их по одной за раз было бы неприятно.
Я не имею ни малейшего представления, что глупая коррекция g ++ применяется для исправления проблемы пропущенной точки с запятой, другиечем не добавить очевидную пропущенную точку с запятой.clang добавляет пропущенную точку с запятой, и это то, на что он жалуется.