Tengo que lidiar con una biblioteca que consta de muchas clases con plantillas, que por supuesto están implementadas en archivos de encabezado. Ahora estoy tratando de encontrar una manera de reducir los tiempos de compilación insoportablemente largos que provienen del hecho de que prácticamente tengo que incluir toda la biblioteca en cada una de mis unidades de compilación.Plantillas: ¿Utilizar declaraciones directas para reducir el tiempo de compilación?
¿Se puede usar una declaración anticipada, a pesar de las plantillas? Estoy intentando algo en la línea del ejemplo a continuación, donde intenté dar la vuelta al #include <vector>
, como ejemplo, pero me está dando un error del enlazador porque push_back
no está definido.
#include <iostream>
namespace std {
template<class T>
class vector {
public:
void push_back(const T& t);
};
}
int main(int argc, char** argv) {
std::vector<int>* vec = new std::vector<int>();
vec->push_back(3);
delete vec;
return EXIT_SUCCESS;
}
$ g++ fwddecl.cpp
ccuqbCmp.o(.text+0x140): In function `main':
: undefined reference to `std::vector<int>::push_back(int const&)'
collect2: ld returned 1 exit status
me trataron encabezados precompilados una vez, pero eso no cambia los tiempos de compilación en absoluto (que se aseguró de que estaban cargados de hecho en lugar de los encabezados reales). Pero si todos dicen que los encabezados precompilados deberían ser el camino a seguir, lo volveré a intentar.
ACTUALIZACIÓN: Algunas personas dicen que no vale la pena reenviar-declarar las clases de STL. Debo recalcar que el STL vector
anterior era solo un ejemplo. Realmente no estoy tratando de reenviar-declarar las clases de STL, pero se trata de otras clases de una biblioteca con muchas plantillas que tengo que usar.
ACTUALIZACIÓN 2: ¿Hay alguna manera de hacer que el ejemplo anterior realmente compile y enlace correctamente? Logan sugiere usar -fno-implicit-templates
y poner template class std::vector<int>
en algún lugar, presumiblemente en un archivo separado .cpp
que se compila con -fno-implicit-templates
, pero sigo recibiendo errores del enlazador. Una vez más, estoy tratando de entender cómo funciona para std::vector
para poder aplicarlo a las clases con plantillas que estoy usando.
en su ejemplo, no se ha declarado hacia adelante nada. Todo lo que hizo fue crear una clase de plantilla llamada vector en el espacio de nombres std. Luego no definió el método push_back que declaró en él. De ahí el error del enlazador. –
Segunda explicación de Evan sobre por qué el std :: vector de declaración hacia adelante no está funcionando (le falta al menos un argumento dentro de los corchetes angulares). Intenta usar una clase de plantilla que escribiste tú mismo, que sabes que no tiene argumentos de plantilla predeterminados. –