usar que miembros miembro metodo funcion estaticos estatico estatica enlace ejemplo dinamico como atributo c++ static

c++ - que - Función miembro con enlace estático



static c++> (1)

Creo que el problema aquí es que la palabra clave static tiene varios significados diferentes en C ++ y el código que has escrito arriba los usa de dos maneras diferentes.

En el contexto de las funciones miembro, static significa "esta función miembro no tiene un objeto receptor. Es básicamente una función normal que está anidada dentro del alcance de la clase".

En el contexto de las declaraciones de funciones, static significa que "esta función está dirigida solo a este archivo y no se puede llamar desde otros lugares".

Cuando implementaste la función por escrito

static void Foobar::do_something() {} // Error!

el compilador interpretó que la static aquí significa "Estoy implementando esta función miembro, y quiero hacer que la función sea local solo para este archivo". Eso no está permitido en C ++ porque causa cierta confusión: si varios archivos diferentes definieron su propia implementación de una función miembro y luego los declararon static para evitar colisiones en el enlace, ¡llamar a la misma función miembro desde diferentes lugares resultaría en un comportamiento diferente!

Afortunadamente, como notó, hay una solución fácil: simplemente elimine la palabra clave static de la definición:

void Foobar::do_something() {} // Should be good to go!

Esto está perfectamente bien porque el compilador ya sabe que do_something es una función miembro static , ya que se lo comentó antes.

¡Espero que esto ayude!

Estoy tratando de entender por qué el siguiente es un error:

class Foobar { public: static void do_something(); }; static void Foobar::do_something() {} // Error! int main() { Foobar::do_something(); }

Este error con "error: no se puede declarar que la función miembro ''static void Foobar :: do_something ()'' tenga enlace estático" en g ++, y "error: ''static'' solo se puede especificar dentro de la definición de clase" en clang ++.

Entiendo que la forma de solucionar esto es eliminar "estática" en la definición de do_something en la línea 6. Sin embargo, no entiendo por qué esto es un problema. ¿Es una razón mundana, tal como "la gramática de C ++ así lo dicta", o está pasando algo más complicado?