c++ - teclado - Declaración de método cambia el significado del símbolo
simbolos informatica definicion (1)
Para el siguiente código:
struct foo {};
struct A
{
typedef foo foo_type;
void foo();
};
GCC da un error de compilación:
test.cpp:7:14: error: declaration of ''void A::foo()'' [-fpermissive]
void foo();
^
test.cpp:1:8: error: changes meaning of ''foo'' from ''struct foo'' [-fpermissive]
struct foo {};
^
Pero Clang lo acepta sin errores de compilación. Quien tiene razon
Tenga en cuenta que si se quita el typedef, o si se cambia a typedef ::foo foo_type
, tanto gcc como clang aceptan el código.
gcc es correcto, pero no se requiere un clang para dar un diagnóstico (3.3.7):
Un nombre N utilizado en una clase S se referirá a la misma declaración en su contexto y cuando se vuelva a evaluar en el alcance completo de S. No se requiere un diagnóstico para violar esta regla.
Esto se debe a cómo funciona el alcance de la clase. El foo
de void foo();
es visible dentro del alcance completo de la clase A
, por lo que la declaración de void foo();
cambia el significado de foo
en el typedef de referirse a struct foo
al nombre de la función foo
.