Erreur des fonctions membres statiques; Comment écrire correctement la signature?

165

J'obtiens une erreur en essayant de compiler mon code en g ++ en utilisant la signature actuelle:

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

Ma question est double:

  1. Pourquoi ne compile-t-il pas de cette façon?
  2. Quelle est la bonne signature et pourquoi?

Les signatures ont toujours été ma mort lors de l'utilisation de C ++

Edit: Voici également le fichier d'en-tête de classe:

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
la source
Vous devez inclure toutes les lignes pertinentes de l'erreur g ++.
Keith Layne
5
Le message d'erreur que vous répertoriez ne peut pas être produit par le code que vous avez publié. Il n'y a Foo::Barnulle part dans votre fragment de programme. Veuillez publier un programme complet et minimal qui démontre l'erreur que vous rencontrez. Un programme complet est un programme que nous pouvons compiler exactement tel quel et recevoir le même message d'erreur que vous. Un programme minimal est un avec chaque ligne sans rapport avec votre erreur supprimée. Le fragment de code que vous avez publié n'est ni complet ni minimal. Voir sscce.org pour plus d'informations.
Robᵩ

Réponses:

415

Je suppose que vous avez fait quelque chose comme:

class Foo
{
    static void Bar();
};

...

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

Le " static void Foo::Bar" est incorrect. Vous n'avez pas besoin du deuxième " static".

Oliver Charlesworth
la source
25
@Oliver: Mais pourquoi?
narengi
14
@narengi: parce que c'est ainsi que le standard C ++ définit la grammaire.
Oliver Charlesworth
2
Quel est le «deuxième»? celui dans le déclarateur ou le on dans sa définition de fonction?
dhein
44
@Zaibis le second n'est pas le premier, mais le second.
maxdev
24
Le mot-clé static n'a pas la même signification dans la déclaration de méthode que dans la définition de fonction. Et une fonction (définition) ne peut pas être statique si c'est une méthode (déclaration) de classe. Par conséquent, vous pouvez le déclarer statique, mais pas le définir statique. Dans la définition de fonction, «statique» a la même signification qu'en C, ce qui est incompatible avec une méthode de classe.
dabicho