Statik üye fonksiyonları hatası; İmza nasıl düzgün yazılır?


165

Geçerli imzayı kullanarak g ++ kodumu derlemeye çalışırken bir hata alıyorum:

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

Sorum iki yönlü:

  1. Neden bu şekilde derlenmiyor?
  2. Doğru imza nedir ve neden?

C ++ kullanırken imzalar hep benim ölümüm oldu

Düzenleme: İşte sınıf üstbilgisi dosyası da:

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);

İlgili tüm satırları g ++ hatasından eklemelisiniz .
Keith Layne

5
Listelediğiniz hata mesajı, gönderdiğiniz kod tarafından üretilemez. Foo::BarProgram parçanızda hiçbir yer yok . Lütfen karşılaştığınız hatayı gösteren eksiksiz , minimal bir program gönderin . Bir tam program olarak ve sizinle aynı hata iletisini tam olarak derlemek olabilir biridir. Bir asgari programı çıkarıldıktan sonra hata ilgisiz her hattıyla biridir. Gönderdiğiniz kod parçası tam veya minimum değil. Daha fazla bilgi için sscce.org adresine bakınız .
Robᵩ

Yanıtlar:


415

Sanırım şöyle bir şey yaptınız:

class Foo
{
    static void Bar();
};

...

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

" static void Foo::Bar" Yanlış. İkincisine ihtiyacınız yok " static".


25
@Oliver: Ama neden?
narengi

14
@narengi: çünkü C ++ standardı dilbilgisini böyle tanımlar.
Oliver Charlesworth

2
Hangisi "ikinci" olan? deklaratörde mi yoksa fonksiyon tanımında açıkta mı?
dhein

44
@Zaibis ikincisi birincisi değil, ikincisi.
maxdev

24
Statik anahtar sözcüğü, yöntem bildiriminde işlev tanımındakiyle aynı anlama gelmez. Ve bir işlev (tanım), bir sınıfın yöntemi (bildirim) ise statik olamaz. Bu nedenle, statik olarak bildirebilirsiniz, ancak statik olarak tanımlayamazsınız. Fonksiyon tanımında 'statik', C sınıfı ile aynı anlama sahiptir, bu da bir sınıf yöntemiyle uyumsuzdur.
dabicho
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.