Kesalahan fungsi anggota statis; Bagaimana cara menulis tanda tangan dengan benar?

165

Saya mendapatkan kesalahan ketika mencoba mengkompilasi kode saya di g ++ menggunakan tanda tangan saat ini:

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

Pertanyaan saya ada dua:

  1. Mengapa tidak kompilasi dengan cara ini?
  2. Apa tanda tangan yang benar, dan mengapa?

Tanda tangan selalu menjadi kematian saya saat menggunakan C ++

Sunting: Ini adalah file header kelas, juga:

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
sumber
Anda harus memasukkan semua baris yang relevan dari kesalahan g ++.
Keith Layne
5
Pesan kesalahan yang Anda daftarkan tidak dapat dihasilkan oleh kode yang Anda poskan. Tidak ada bagian Foo::Bardalam fragmen program Anda. Silakan kirim program lengkap , minimal yang menunjukkan kesalahan yang Anda alami. Sebuah lengkap Program adalah salah satu yang kita dapat mengkompilasi persis seperti apa adanya dan menerima pesan kesalahan yang sama seperti Anda. Sebuah minimal Program adalah satu dengan setiap baris yang tidak terkait dengan kesalahan Anda dihapus. Fragmen kode yang Anda poskan tidak lengkap atau minimal. Lihat sscce.org untuk info lebih lanjut.
Robᵩ

Jawaban:

415

Saya kira Anda telah melakukan sesuatu seperti:

class Foo
{
    static void Bar();
};

...

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

" static void Foo::Bar" Salah . Anda tidak membutuhkan yang kedua " static".

Oliver Charlesworth
sumber
25
@Liver: Tapi mengapa?
narengi
14
@narengi: karena begitulah standar C ++ mendefinisikan tata bahasa.
Oliver Charlesworth
2
Yang mana yang "kedua"? yang ada di deklarator atau di dalam definisi fungsinya?
dhein
44
@Zaibis yang kedua bukan yang pertama, tapi yang kedua.
maxdev
24
Kata kunci statis tidak memiliki arti yang sama dalam deklarasi metode daripada dalam definisi fungsi. Dan fungsi (definisi) tidak bisa statis jika itu adalah metode kelas (deklarasi). Oleh karena itu, Anda dapat mendeklarasikannya statis, tetapi tidak mendefinisikannya statis. Dalam definisi fungsi 'statis' memiliki arti yang sama dengan di C, yang tidak kompatibel dengan metode kelas.
dabicho