Je ne peux pas comprendre, pourquoi si nous définissons la variable statique de la classe habituelle (non-modèle) dans l'en-tête, nous avons une erreur de lien, mais dans le cas de modèles tout fonctionne bien et nous aurons une instance unique variable statique entre toutes les unités de traduction:Modèle variable statique
Il est tête de modèle (template.h):
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
Il est la première unité modèle à l'aide (Unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
Deuxième unité il re (unit2.cpp):
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
Et, enfin, 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;
}
Après compilling, la liaison et l'exécution de ce code, nous avons sortie suivante:
0
1
Alors, pourquoi dans le cas de modèles tout fonctionne bien (et comme prévu)? Comment compilateur ou éditeur de liens gérer cela (nous pouvons compiler chaque fichier. Cpp dans l'appel séparé du compilateur, puis les lier avec caling à l'éditeur de liens, de sorte que le compilateur et l'éditeur de liens ne "voient" pas tous les fichiers.
PS: Mon compilateur: msvcpp 9 (mais nous sommes sur MinGW aussi)
Il serait plus utile de nous montrer le code ** qui ne fonctionne pas. – JesperE
Je suppose que le code qui ne fonctionne pas est celui où vous définissez une variable dans un en-tête qui est incluse dans plus d'un fichier (non externé), ce qui entraîne une collision de nommage. – falstro