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?