Bu örneğin neden derlenmediğini anlamaya çalışıyorum. Anlayışım, statik bir değişken açıkça ayarlanmadığı takdirde varsayılan olarak 0'a ayarlanmasıdır. Dört örnekte, dördü aşağıda beklediğim gibi davranır, ancak yorumda bulunacak olanı derlemez.Şablonlu bir sınıfın statik üyelerini sıfırlama
#include <iostream>
class Foo
{
public:
static int i;
static int j;
};
template <int n>
class Bar
{
public:
Bar(int) { }
static int i;
};
static int i;
int Foo::i;
int Foo::j = 1;
template <> int Bar<2>::i;
template <> int Bar<3>::i = 3;
int main(int argc, char** argv)
{
std::cout << "i " << i << std::endl;
std::cout << "Foo::i " << Foo::i << std::endl;
std::cout << "Foo::j " << Foo::j << std::endl;
//std::cout << "Bar<2>::i " << Bar<2>::i << std::endl; // Doesn't compile?
std::cout << "Bar<3>::i " << Bar<3>::i << std::endl;
return 0;
}
Neden int Bar<2>::i
int Foo::i
veya static int i
aynı şeyi yapmıyor?
Düzenleme: Bar < 2 şablonu <> ekle> ve < 3> bildirimleri Bar unutmuştu. Standart C son Taslağa göre
[Özel şablon sınıfı için statik üye başlatma] 'nın kopyası (http://stackoverflow.com/questions/2342550/static-member-initialization-for-specialized-template-class). –
Bağlantı hatası nedir? – Chubsdad
@Chubsdad: Kuşkusuz, "Bar <2> :: i" tanımına atıfta bulunulmamış. OP'nin kodunda, 'template <> int Bar <2> :: i; 'bir _nondefining_ bildirgesidir (litb'nin ayrıntılı açıklaması için bağlantılı çoğaltmaya bakın). –