Nie mogę zrozumieć, dlaczego jeśli zdefiniujemy zmienną statyczną zwykłej (nie-szablonowej) klasy w nagłówku, mamy błąd linkera, ale w przypadku szablonów wszystko działa dobrze, a ponadto będziemy mieć pojedyncze wystąpienie zmienna statyczna wśród wszystkich jednostek tłumaczeniowych:Zmienna statyczna szablonu
To nagłówek szablonu (template.h):
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
To pierwsza jednostka przy użyciu szablonu (unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
Druga jednostka on re (unit2.cpp):
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
I wreszcie 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;
}
Po compilling, łączenie i wykonaniu tego kodu, będziemy mieli następujące dane wyjściowe:
0
1
Dlaczego w przypadku szablonów wszystko działa poprawnie (i zgodnie z oczekiwaniami)? Jak radzi sobie z tym kompilator lub linker (możemy skompilować każdy plik .cpp w oddzielnym wywołaniu kompilatora, a następnie połączyć je z calingiem do linkera, więc kompilator i linker nie "zobaczą" wszystkich plików .cpp w tym samym czasie)?
PS: Mój kompilator: msvcpp 9 (ale sprawdzane na MinGW zbyt)
Byłoby bardziej przydatne, gdybyś pokazał nam kod, który ** nie działa **. – JesperE
Przypuszczam, że kod, który nie działa, to ten, w którym definiujesz zmienną w nagłówku, która jest zawarta w więcej niż jednym pliku (bez rozszerzenia), co powoduje kolizję nazw. – falstro