Solución:
Una forma de rastrear tales errores es comenzar desde cero:
#include "filepath/ui.h"
int main () { return 0; }
¿Esto se compila? (Esto funciona bien con el pequeño fragmento de ui.h que proporcionó).
Errores como estos a menudo son causados por un punto y coma que falta en alguna declaración de clase anterior. Así que intentemos forzar el problema:
struct Foo { int foo; } // Note the missing semicolon after the close brace.
#include "filepath/ui.h"
int main () { return 0; }
Por supuesto, esto no se compila limpio. Obtengo un rastreo de ruta de inclusión complicado de mi testmain.cpp a su ruta de archivo / ui.h a cadena … y finalmente obtengo
/usr/include/i386/_types.h:37: error: two or more data types in declaration of '__int8_t'
Así que ese no es el error, pero el punto y coma que falta está creando un lío. Tu error no surge en las entrañas de <string>
, así que hagamos nuestro programa de prueba #include <string>
antes de intentar recrear el error:
#include <string>
struct Foo { int foo; } // Note the missing semicolon after the close brace.
#include "filepath/ui.h"
int main () { return 0; }
Y el mensaje de error es
In file included from testmain.cpp:5:
filepath/ui.h:6: error: expected unqualified-id before 'namespace'
Y ahí está. Entonces, algún otro encabezado que #incluye antes de filepath / ui.h tiene una declaración de clase mal formada.
Apéndice
A veces ayuda utilizar un compilador diferente. g ++ es conocido por su mal tratamiento de este error de programación común. Compilando lo anterior con rendimientos clang
testmain.cpp:4:2: error: expected ';' after struct
Entonces, tada, clang se ha concentrado en el problema.
Lo que está sucediendo es que cuando un compilador tiene problemas, aplica alguna corrección a su código para hacerlo gramaticalmente correcto. El mensaje de error del compilador se basa en esta autocorrección. Observe bien: esta autocorrección es, en general, algo muy bueno. Sin él, el compilador tendría que cerrarse necesariamente al primer error. Dado que los programadores inevitablemente cometen más de un error, cazarlos uno a la vez sería un dolor de cabeza.
No tengo la menor idea de qué corrección tonta se aplica g ++ para solucionar el problema del punto y coma que falta, aparte de no agregar el punto y coma que falta obviamente. clang agrega el punto y coma que falta, y eso es de lo que se queja.