2015-07-08 25 views
13

: hata" ileÜye işlevi aşağıdaki hata neden anlamaya çalışıyorum

class Foobar { 
public: 
    static void do_something(); 
}; 

static void Foobar::do_something() {} // Error! 

int main() { 
    Foobar::do_something(); 
} 

Bu hatalar: üye işlevi ilan edemez 'static void Falanca :: do_something()' sahip olmak Statik bağlantı "g ++" ve "error: 'statik' yalnızca sınıf tanımının içinde belirtilebilir".

Bunu düzeltmenin yolunun, 6. satırdaki do_something tanımındaki "statik" öğesinin kaldırılması olduğunu anlıyorum. Ancak, bunun neden bir sorun olduğunu anlamıyorum. "C++ dilbilgisi böyle dikte ediyor" gibi sıradan bir neden mi, yoksa daha karmaşık bir şey mi oluyor?

+0

Olası yinelenen [Static üye işlevleri hatası; İmza nasıl yazılır?] (Https://stackoverflow.com/questions/8130066/static-member-functions-error-how-to-properly-write-the-signature) –

cevap

29

Buradaki sorun, buradaki anahtar kelimenin static anahtar kelimesinin C++ 'da birkaç farklı anlamı olduğunu ve yukarıda yazdığınız kodun bunları iki farklı şekilde kullandığını düşünüyorum.

Üye işlevleri bağlamında, static, "bu üye işlevinin bir alıcı nesnesi yoktur. Bu, temel olarak sınıfın kapsamının içine yerleştirilmiş normal bir işlevdir."

İşlev bildirimleri bağlamında, static, "bu işlev yalnızca bu dosya için kapsamlandırılır ve diğer yerlerden çağrılmaz." Eğer

static void Foobar::do_something() {} // Error! 

yazarak fonksiyonu hayata

derleyici anlamında burada static yorumlanır "Bu üye işlevi uygulayan ediyorum ve sadece bu dosyaya yerel o fonksiyonu yapmak istiyorum." C++ 'da buna izin verilmediğinden bazı karışıklıklara neden olur: Birden fazla farklı dosya bir üye işlevinin kendi uygulamasını tanımladıysa ve daha sonra bağlantıda çakışmalardan kaçınmak için onları static bildirdiyse, aynı üye işlevini farklı yerlerden çağırmak farklı davranışlara neden olur! Eğer belirtildiği gibi

Neyse ki, kolay bir düzeltme var: Sadece tanımından static anahtar kelimeyi silin:

void Foobar::do_something() {} // Should be good to go! 

Bu derleyici zaten do_something bir static üye fonksiyonu size beri olduğunu bildiği için mükemmel gayet Daha önce bunun hakkında söyledi.

Bu yardımcı olur umarız!

+1

Bu mantıklı, teşekkürler! Derleyicinin statik boşluk bazı_fonksiyonu() {...} ve statik boşluklu Foobar :: some_method() {...} arasında ayrım yapabileceğini varsayalım. farklı anlambilim ve çok benzer sözdizimi. Ben çözümden çok memnun değilim, çünkü bir yöntemin uygulanmasına (yorumsuz) bakarak statik olduğunu görmek zorlaşıyor, ama iyi. –

+0

"Bu, normalde sınıfın kapsamının içine yerleştirilmiş normal bir işlevdir" ifadesini normal olarak global mi kastediyorsunuz? – TheLogicGuy

İlgili konular