Statyczny błąd funkcji składowych; Jak poprawnie napisać podpis?

165

Otrzymuję błąd podczas próby skompilowania mojego kodu w g ++ przy użyciu bieżącego podpisu:

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

Moje pytanie jest dwojakie:

  1. Dlaczego nie kompiluje się w ten sposób?
  2. Jaki jest prawidłowy podpis i dlaczego?

Podpisy zawsze były moją śmiercią, kiedy używałem C ++

Edycja: oto również plik nagłówkowy klasy:

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
źródło
Powinieneś dołączyć wszystkie odpowiednie wiersze z błędu g ++.
Keith Layne
5
Wyświetlany komunikat o błędzie nie może zostać wygenerowany przez opublikowany kod. W Foo::BarTwoim fragmencie programu nie ma nigdzie. Prześlij kompletny , minimalny program, który demonstruje występujący błąd. Kompletny program to taki, który możemy skompilować dokładnie jak jest i ten sam komunikat o błędzie, jak ty. Minimalny program jest jednym z każdej linii niezwiązanej do błędu usunięte. Przesłany fragment kodu nie jest ani kompletny, ani minimalny. Więcej informacji można znaleźć na sscce.org .
Robᵩ

Odpowiedzi:

415

Zgaduję, że zrobiłeś coś takiego:

class Foo
{
    static void Bar();
};

...

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

W „ static void Foo::Bar” jest nieprawidłowy. Nie potrzebujesz drugiego „ static”.

Oliver Charlesworth
źródło
25
@Oliver: Ale dlaczego?
narengi
14
@narengi: ponieważ w ten sposób standard C ++ definiuje gramatykę.
Oliver Charlesworth
2
Który jest „drugi”? ten w deklaratorze czy on w definicji funkcji?
dhein
44
@Zaibis ten drugi nie jest pierwszym, ale drugim.
maxdev
24
Słowo kluczowe static nie ma tego samego znaczenia w deklaracji metody, jak w definicji funkcji. Funkcja (definicja) nie może być statyczna, jeśli jest metodą (deklaracją) klasy. Dlatego możesz zadeklarować go jako statyczny, ale nie możesz go zdefiniować jako statyczny. W definicji funkcji „statyczna” ma takie samo znaczenie jak w języku C, co jest niezgodne z metodą klasy.
dabicho,