2011-11-21 21 views
14

Acabo de leer el artículo de wiki sobre CRTP, y estoy un poco confundido acerca de la creación de instancias de plantilla.instanciación de plantilla de clase

Según la wiki,

cuerpos de las funciones miembro (definiciones) no se instancian hasta mucho tiempo después de sus declaraciones.

No entiendo muy bien lo que significa.

Supongamos que tiene una plantilla de clase:

template <typename T> 
class A 
{ 
    public: 
     void foo(T t) 
     { 
      //... 
     }; 
}; 

Cuando una instancia de la plantilla de clase A, lo hace una instancia de la función foo miembro()?

Por ejemplo:

//in .cpp file 
int main() 
{ 
    A<int> a; //question 1 
       //class template is instantiated here, isn't it? 
       //What about foo(), is it instantiated too? 

    a.foo(10); //question 2 
       //according to the quotation, foo() will not be instantiated until it is used. 
       //if so, foo() is instantiated right here, not in question 1, right? 
} 
+2

enchufe: Esto puede responder a sus preguntas: http: // stackoverflow.com/questions/7182359/template-instanciaiation-details-of-gcc-and-ms-compilers/7241548 # 7241548 –

Respuesta

12

usted parece estar confundiendo una cosa:

instanciación sucede durante la compilación , no durante el tiempo de ejecución. Por lo tanto, no puede decir "en qué línea" se creó una instancia de una plantilla de clase o una plantilla de función.

Dicho esto, tiene razón acerca del hecho de que las plantillas de funciones miembro no se crean instancias junto con las plantillas de clase.

Se puede observar que en tal caso: Usted tiene los siguientes archivos

  • template.h (define la clase A y A :: foo)
  • a.cpp (utiliza A)
  • b.cpp (utiliza A y A :: foo)

A continuación, durante la compilación de a.cpp, solamente habría un ser instanciada. Sin embargo, durante la compilación de b.cpp, ambos serían instanciados.

Debido a esto, en el caso de que A :: foo contenga algún código semánticamente no válido para un conjunto dado de parámetros de plantilla, obtendría errores de compilación en b.cpp, pero no en a.cpp.

Espero que aclare las cosas!

+0

Lo entiendo ahora, gracias. – Alcott

8

Con las plantillas de clase, la regla de oro es que solo se crean instancias de los miembros que realmente se utilizan.

Si desea instanciación completa, C++ ofrece instancias explícita (sin embargo, por lo general no lo hace; el hecho de que no todos los bits está totalmente instancia significa que su clase de plantilla es aún más genérica, ya que disminuye los requisitos de T , tenga en cuenta que la comprobación de sintaxis y la búsqueda de tipos no dependientes (cosas que no dependen de T) aún ocurren).

Encontrará una respuesta más completa aquí: Template instantiation details of GCC and MS compilers

+0

Votación a favor de mencionar la creación de instancias explícitas instanciación completa – FaceBro

Cuestiones relacionadas