2012-08-31 13 views
8

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.

Respuesta

13

Esto funciona porque [basic.def.odr]/5 plantillas permitidos explícitamente a ser duplicadas:

No puede haber más de una definición de un tipo de clase (Cláusula 9), tipo de enumeración (7.2), función en línea con enlace externo (7.1 .2), plantilla de clase (cláusula 14), plantilla de función no estática (14.5.6), miembro de datos estáticos de una plantilla de clase (14.5.1.3), función miembro de una plantilla de clase (14.5.1.1) o especialización de plantilla para el cual no se especifican algunos parámetros de plantilla (14.7, 14.5.5) en un programa, siempre que cada definición aparezca en una unidad de traducción diferente, y siempre que las definiciones satisfagan los siguientes requisitos. ...

Los requisitos son bastante largo, así que no voy a reproducir aquí, pero en esencia afirmar que cada definición duplicada debe ser idéntico (comportamiento de lo contrario el programa se ha definido).

Cuestiones relacionadas