Ich kann nicht verstehen, warum, wenn wir statische Variable der üblichen (Nicht-Vorlage) -Klasse im Header definieren, haben wir Linker Fehler, aber im Falle von Vorlagen funktioniert alles gut und außerdem werden wir Einzelinstanz von haben statische Variable bei allen Übersetzungseinheiten:Template statische Variable
Es ist Template-Header (template.h):
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
Es ist die erste Einheit Vorlage (unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
Zweite Einheit mit ihm re (unit2.cpp):
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
Und schließlich main.cpp:
// main.cpp
#include <iostream>
int method1();
int method2();
int main(int argc, char** argv) {
std::cout << method1() << std::endl;
std::cout << method2() << std::endl;
}
Nach compilling, Verknüpfen und Ausführen dieses Codes, haben wir folgende Ausgabe:
0
1
Also, warum im Falle von Vorlagen funktioniert alles gut (und wie erwartet)? Wie Compiler oder Linker das behandeln (wir können jede CPP-Datei in getrennten Aufrufen des Compilers kompilieren und dann mit Caling zu Linker verknüpfen, damit Compiler und Linker nicht alle CPP-Dateien zur gleichen Zeit "sehen")?
PS: Mein Compiler: msvcpp 9 (aber auch auf mingw geprüft)
Es wäre nützlicher, wenn Sie uns den Code zeigen würden, der ** nicht ** funktioniert. – JesperE
Ich vermute, dass Code, der nicht funktioniert, derjenige ist, wo Sie eine Variable in einer Kopfzeile definieren, die in mehr als einer Datei enthalten ist (nicht extern), was zu einer Namenskollision führt. – falstro