Error de funciones de miembro estático; ¿Cómo escribir correctamente la firma?

165

Recibo un error al intentar compilar mi código en g ++ con la firma actual:

cannot declare member function static void Foo::Bar(std::ostream&, const Foo::Node*) to have static linkage

Mi pregunta es doble:

  1. ¿Por qué no se compila de esta manera?
  2. ¿Cuál es la firma correcta y por qué?

Las firmas siempre han sido la muerte para mí cuando uso C ++

Editar: Aquí también está el archivo de encabezado de clase:

class Foo {


public:
    Foo();

    ~Foo();

    bool insert(const Foo2 &v);

    Foo * find(const Foo2 &v);

    const Foo * find(const Foo2 &v) const;

    void output(ostream &s) const;

private:
    //Foo(const Foo &v);
    //Foo& operator =(const Foo &v);
    //Not implemented; unneeded


    struct Node {
        Foo2 info;
        Node *left;
        Node *right;
    };

    Node * root;

    static bool insert(const Foo2 &v, Node *&p);


    static void output(ostream &s, const Node *p);


    static void deleteAll(Node *p);
Joshua
fuente
Debe incluir todas las líneas relevantes del error de g ++.
Keith Layne
55
El mensaje de error que enumera no puede ser producido por el código que publicó. No hay Foo::Barningún fragmento en su programa. Publique un programa completo y mínimo que demuestre el error que está teniendo. Un programa completo es aquel que podemos compilar exactamente como está y recibir el mismo mensaje de error que usted. Un programa mínimo es uno con cada línea no relacionada con su error eliminado. El fragmento de código que publicó no es completo ni mínimo. Ver sscce.org para más información.
Robᵩ

Respuestas:

415

Supongo que has hecho algo como:

class Foo
{
    static void Bar();
};

...

static void Foo::Bar()
{
    ...
}

El " static void Foo::Bar" es incorrecto. No necesitas el segundo " static".

Oliver Charlesworth
fuente
25
@ Oliver: ¿Pero por qué?
narengi
14
@narengi: porque así es como el estándar C ++ define la gramática.
Oliver Charlesworth
2
¿Cuál es el "segundo"? ¿el que está en el declarador o el encendido en su definición de función?
dhein
44
@Zaibis el segundo no es el primero, sino el segundo.
maxdev
24
La palabra clave static no tiene el mismo significado en la declaración del método que en la definición de la función. Y una función (definición) no puede ser estática si es un método de clase (declaración). Por lo tanto, puede declararlo estático, pero no definirlo como estático. En la definición de función, 'static' tiene el mismo significado que en C, que es incompatible con un método de clase.
dabicho