Erro de funções de membro estático; Como escrever corretamente a assinatura?

165

Estou recebendo um erro ao tentar compilar meu código em g ++ usando a assinatura atual:

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

Minha pergunta é dupla:

  1. Por que não compila dessa maneira?
  2. Qual é a assinatura correta e por quê?

As assinaturas sempre foram a minha morte ao usar C ++

Edit: Aqui está o arquivo de cabeçalho da classe, também:

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
fonte
Você deve incluir todas as linhas relevantes do erro g ++.
Keith Layne
5
A mensagem de erro que você lista não pode ser produzida pelo código que você postou. Não há nenhum Foo::Barlugar no seu fragmento de programa. Poste um programa completo e mínimo que demonstre o erro que você está tendo. Um programa completo é aquele que podemos compilar exatamente como está e receber a mesma mensagem de erro que você. Um programa mínimo é aquele com todas as linhas não relacionadas ao seu erro removidas. O fragmento de código que você postou não é completo nem mínimo. Veja sscce.org para mais informações.
Robᵩ

Respostas:

415

Suponho que você tenha feito algo como:

class Foo
{
    static void Bar();
};

...

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

O " static void Foo::Bar" está incorreto. Você não precisa do segundo " static".

Oliver Charlesworth
fonte
25
@ Oliver: Mas por quê?
procurando
14
@ Narengi: porque é assim que o padrão C ++ define a gramática.
Oliver Charlesworth
2
Qual é o "segundo"? aquele no declarador ou o na sua definição de função?
Dhein
44
@Zaibis, o segundo não é o primeiro, mas o segundo.
maxdev
24
A palavra-chave static não tem o mesmo significado na declaração do método que na definição da função. E uma função (definição) não pode ser estática se for um método de classe (declaração). Portanto, você pode declarar estático, mas não defini-lo estático. Na definição de função 'estático' tem o mesmo significado que em C, que é incompatível com um método de classe.
dabicho 7/09/16