2011-11-09 14 views
16

C++ 'da sınıf tanımı anında eksik olan bir tür statik alan bildiriyor mu?Tamamlanmamış türde statik alan - yasal mı?

Foo.h:

class Foo 
{ 
public: 
    // ... 
private: 
    class Bar; 
    static Bar something; 
}; 

foo.cpp: Örneğin

class Foo::Bar 
{ 
    // ... 
}; 

Foo::Bar Foo::something; 

// some more code 

Derleyiciler onu kabul gibi görünüyor ve olması gerektiği kendisi için bir neden görmüyorum reddedildi, ama standart böyle bir durum hakkında ne diyor? Standarttan, tercihen "eski" olandan (2003'ten itibaren) doğrudan alıntı yapan birini takdir ediyorum.

cevap

13

Evet, yaptığınız özellikle özel olarak izin veriliyor (§9.4.2/2): "Sınıf tanımında statik bir veri öğesinin bildirimi bir tanım değildir ve cv'den başka eksik bir türde olabilir. nitelikli boşluk. "

2

Standarttan alıntı yapamıyorum, ancak size "derleyici gibi düşün" tavsiyesinde bulunabilirim.

something bildirmekte olduğunuz noktada, derleyicinin türü hakkında bilmesi gereken nedir? Normal bir üye olsaydı, sınıf tanımına dahil edebilmesi için boyutu bilmesi gerekirdi, ancak bu, statik üyeler için geçerli değil çünkü depoları sınıfın bir parçası değil. Sınıf inşasının bir parçası olarak inşa edilmeyeceği için onu nasıl inşa edeceğini bilmesi gerekmiyor. Derleyicinin, bildirildiği anda bu statik sınıf hakkında bilmesi gereken bir şey yoktur, bu nedenle ileriye dönük bir bildirim gayet iyi çalışır.

+1

Yup. Bu yüzden "reddedilmesi gereken bir neden görmüyorum" dedim. Yazdığınız şeyleri biliyorum, standardın bir nedenden ötürü böyle bir kodu engellemediğinden emin değildim (C++, asla emin olamazsınız), bu yüzden direkt bir teklif istiyorum. Ayrıca, ilk sorumu burada sormam gerekiyordu;) – Fanael