Tengo este grave problema. Tengo una enumeración dentro de 2 espacios de nombres como esto:Conflicto entre un espacio de nombres y una definición
namespace FANLib {
namespace ERROR {
enum TYPE {
/// FSL error codes
FSL_PARSER_FILE_IERROR,...
y otra parte de mi código, utilizar de esta manera:
FANLib::Log::internalLog(FSLParser::FILE_IERROR, file_ierror, true, FANLib::ERROR::FSL_PARSER_FILE_IERROR);
Todo compila bien y bien, pero si resulta que incluyen " windows.h ", obtengo errores! El problema está en "WinGDI.h" que tiene esta línea:
#define ERROR 0
y hace que el compilador piensa que, después de FANLib :: ..., hay un cero! El error que consigo es:
de error 1 C2589 de error: 'constante': token ilegal en el lado derecho de la '::'
error 2 error C2059: error de sintaxis: '::'
error 3 error C2039: 'FSL_PARSER_FILE_IERROR': no es un miembro de '`espacio de nombres global''
¿hay algo que pueda hacer al respecto, sin tener que cambiar mis espacios de nombres debido a algún imprudente #define
? He leído en otra publicación que podría #undef ERROR, pero ¿qué tan seguro es eso?
Usted hace varios puntos muy buenos. Desafortunadamente, solo puedo dar tu respuesta un voto. – sbi
Agregaría que la "convención aceptada de forma estándar" es que los identificadores que son todos mayúsculas son macros. –
Windows.h toma todas las "convenciones aceptadas de forma estándar", las arroja por la ventana y declara macros por todas ellas. Pero sí, buen consejo. No utilice mayúsculas para nada que no sea #defines, y no permita que windows.h sea visible en sus encabezados. – jalf