2010-08-09 24 views
5

Estoy tratando de compilar con g ++ 4.4 y vincular un programa simple que usa el STL. Estoy intentando hacerlo usando -fno-implicit-templates, por lo que todas las plantillas deben crearse instancias explícitamente.std :: map and -fno-implicit-templates

No entiendo por qué funciona este código:

#include <map> 
//template class std::map<char,char>; 
template class std::_Rb_tree<char, std::pair <char const, char>, 
       std::_Select1st<std::pair<char const, char> >, 
       std::less<char>, std::allocator<std::pair<char const, char> > >; 

int main() { 
    std::map <char,char> table; 
return 0; 
} 

yo esperaría que este programa necesita la línea: template class std::map<char,char>;, sin embargo, que la línea no hace que el vínculo del programa. Se necesita std::_Rb_tree line. ¿Por qué?

Gracias de antemano, cualquier pista será apreciada.

Respuesta

7

Los mapas usan árboles rojo-negro en su implementación, por lo que debe crear una instancia explícita del tipo de árbol requerido para la creación de instancias del mapa. Esto no parece una bandera de compilador particularmente útil, en mi humilde opinión.

+3

Estoy de acuerdo con Neil: el problema de este indicador es que necesita crear una instancia explícita de cada componente de la clase, lo que lo expone a cada detalle de la implementación ... URK. Tienes suerte de comenzar con el STL, que es bastante simple, pruébalo con una gran biblioteca de impulso y llorarás todas las lágrimas de tu cuerpo antes de que tengas éxito compilando. –

+4

+1 Un nombre de la bandera más honesto sería --you-have-elect-the-way-of-pain –

+0

@chrispy: sería aún mejor si el compilador lo leyó en la voz de Christopher Lee. – Peter

Cuestiones relacionadas