Fehler bei statischen Elementfunktionen; Wie schreibe ich die Signatur richtig?

165

Beim Versuch, meinen Code in g ++ mit der aktuellen Signatur zu kompilieren, wird eine Fehlermeldung angezeigt:

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

Meine Frage ist zweifach:

  1. Warum wird es nicht so kompiliert?
  2. Was ist die richtige Signatur und warum?

Signaturen waren immer der Tod von mir, wenn ich C ++ verwendete

Bearbeiten: Hier ist auch die Klassenheaderdatei:

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
quelle
Sie sollten alle relevanten Zeilen aus dem g ++ - Fehler einschließen .
Keith Layne
5
Die von Ihnen aufgelistete Fehlermeldung kann nicht durch den von Ihnen geposteten Code erzeugt werden. Es gibt Foo::Barnirgendwo in Ihrem Programmfragment. Bitte posten Sie ein vollständiges , minimales Programm, das den Fehler demonstriert, den Sie haben. Ein vollständiges Programm ist eines, das wir genau so kompilieren können, wie es ist, und die gleiche Fehlermeldung wie Sie erhalten. Ein minimales Programm ist eines, bei dem jede Zeile, die nicht mit Ihrem Fehler zusammenhängt, entfernt wurde. Das von Ihnen gepostete Codefragment ist weder vollständig noch minimal. Weitere Informationen finden Sie unter sscce.org .
Robᵩ

Antworten:

415

Ich vermute, Sie haben so etwas getan wie:

class Foo
{
    static void Bar();
};

...

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

Das " static void Foo::Bar" ist falsch. Du brauchst nicht das zweite " static".

Oliver Charlesworth
quelle
25
@ Oliver: Aber warum?
Narengi
14
@narengi: denn so definiert der C ++ - Standard die Grammatik.
Oliver Charlesworth
2
Welches ist das "zweite"? die im Deklarator oder die in seiner Funktionsdefinition?
Dhein
44
@Zaibis der zweite ist nicht der erste, sondern der zweite.
Maxdev
24
Das Schlüsselwort static hat in der Methodendeklaration nicht dieselbe Bedeutung wie in der Funktionsdefinition. Und eine Funktion (Definition) kann nicht statisch sein, wenn es sich um eine Klassenmethode (Deklaration) handelt. Daher können Sie es als statisch deklarieren, aber nicht als statisch definieren. In der Funktionsdefinition hat 'statisch' dieselbe Bedeutung wie in C, was mit einer Klassenmethode nicht kompatibel ist.
Dabicho