No puedo entender, ¿por qué si definimos la variable estática de la clase habitual (sin plantilla) en el encabezado, tenemos un error de enlazador, pero en el caso de las plantillas todo funciona bien y además tendremos una sola instancia de variable estática entre todas las unidades de traducción:Variable estática de plantilla
es cabecera plantilla (template.h):
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
es primera unidad usando la plantilla (unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
Segunda unidad de él Re (unit2.cpp):
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
Y, por último, 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;
}
Después compilling, la vinculación y ejecución de este código, habremos siguiente resultado:
0
1
Entonces, ¿por qué en el caso de las plantillas todo funciona bien (y como se esperaba)? ¿Cómo manejan esto el compilador o el enlazador (podemos compilar cada archivo .cpp en una llamada separada del compilador, y luego vincularlos con caling to linker, para que el compilador y el enlazador no "vean" todos los archivos .cpp al mismo tiempo)?
PS: Mi compilador: msvcpp 9 (pero comprobado en MinGW también)
Sería más útil si nos mostrara el código ** que ** no funciona. – JesperE
Supongo que el código que no funciona es el que define una variable en un encabezado que se incluye en más de un archivo (no externo), lo que da como resultado una colisión de nombres. – falstro