Consideremos el siguiente constructo:plantillas de C++ y los miembros estáticos - definición en la cabecera
//! Templated singleton.
/*!
Template wrapper enforcing the singleton behavior.
*/
template <class T>
class TSingleton
{
private:
//! Singleton instance pointer.
static T* instance;
//! private constructor.
TSingleton() { }
//! private empty copy constructor.
TSingleton(const TSingleton<T>& sourceObject) {}
public:
//! Static singleton instance getter.
static T* GetInstance()
{
if (instance == 0)
instance = new T();
return instance;
}
};
template <class T> T* TSingleton<T>::instance = 0;
Esta clase de plantilla y la definición de la instancia estática están escritos en el mismo archivo de cabecera. Para una clase que no sea de plantilla, este causa un error de tiempo de enlace debido a la definición de múltiples símbolos para el miembro estático de la instancia. Parece intuitivo que esto también ocurra con las plantillas, por lo que se debe separar la definición y colocarla en un archivo .cpp. Pero las plantillas generalmente se declaran y definen en archivos tipo encabezado. ¿Qué es lo que permite que esta sintaxis sea válida y funcional para las clases de plantilla?
Existe un enlace wikipedia, pero no proporciona una explicación clara de lo que sucede en el caso de las clases de plantilla.