Ich versuche herauszufinden, warum dieses Beispiel nicht kompiliert. Mein Verständnis ist, dass, wenn eine statische Variable nicht explizit festgelegt ist, sie standardmäßig auf 0 gesetzt wird. In den folgenden fünf Beispielen verhalten sich vier von ihnen wie erwartet, aber die auskommentierte wird nicht kompiliert.Initialisierung statischer Member einer Vorlagenklasse
#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;
}
Warum int Bar<2>::i
nicht das gleiche tun wie int Foo::i
oder static int i
?
Edit: Ich hatte vergessen, Vorlage <> zu den Bar < 2> und Bar < 3> Deklarationen hinzuzufügen. (Löst nicht das Problem, aber immer noch Linker Fehler bekommen)
Duplikat von [statische Elementinitialisierung für spezialisierte Template-Klasse] (http://stackoverflow.com/questions/2342550/static-member-initialization-for-specialized-template-class). –
Was ist der Verknüpfungsfehler? – Chubsdad
@Chubsdad: Zweifellos ist es "Undefinierter Verweis auf' Bar <2> :: i' "oder etwas, das bedeutet. Im OP-Code ist 'template <> int Bar <2> :: i;' eine _novefining_deklaration (siehe das verknüpfte Duplikat für die detaillierte Erklärung von litb). –