2010-11-17 22 views
8

El encabezado <iostream> tiene un compañero <iosfwd> que es suficiente si solo necesito punteros o referencias a transmisiones. Este último es un escenario común cuando se sobrecarga operator<<.Encabezados hacia adelante para contenedores STL

¿Hay un encabezado para los contenedores STL? Quiero definir un par de funciones que toman referencias a contenedores STL, y no quiero incluir <vector>, <list>, <set> et. Alabama. en su totalidad solo para que pueda tener referencias a esos tipos. ¿Hay soluciones estándar, de refuerzo u otras para este problema?

+0

El "problema" para esto es usar encabezados precompilados para incluir encabezados costosos como Boost y otras libretas de plantillas. Visual C++ tiene estos, no está seguro acerca de otros compiladores. Si lo hace, sea conservador e incluya también trabajo- en curso encabezados, o encontrará que tiene una gran cantidad de reconstrucciones completas frustrantes. –

+0

@up - Así es, también tiene encabezados precompilados. Pero no soy un usuario de esos y en realidad no estoy seguro de la Rendimiento de rendimiento en tiempo de compilación de aquellos en lo que respecta a las plantillas: por lo que escuché, el contenido de un PCH con plantillas no es muy diferente del código fuente en sí mismo. :) Lo cual suena algo lógico. – Kos

+0

@Kos: no se pretende que los contenidos sean diferentes, es para reducir el tiempo de construcción general al no tener que leer y preprocesar los archivos de encabezado completos en cada unidad de compilación que los necesite. –

Respuesta

1

No, desafortunadamente no. El estándar solo introdujo <iosfwd> para la compatibilidad con versiones anteriores del código de soporte que se escribió para la biblioteca de flujos IO anterior sin plantillas.

4

¿Existe un encabezado para los contenedores STL?

No, no lo hay.

¿Existen soluciones estándar, de refuerzo u otras para este problema?

No es que yo sepa.

Deberá incluir esos encabezados.

0

En realidad, ¿por qué no sería posible tener una declaración de clase de plantilla avanzada?

Si necesita desesperadamente una solución, usted podría ser capaz de ir con algo como esto:

namespace std { 

    template<typename T> 
    class allocator; 

    template<typename T, typename Alloc> 
    class vector; 
} 

Añadir un include guardia, guardar como "stdfwd.h" o algo así y ya está.

Entonces algo como esto funciona sin incluir <vector>:

void print(std::vector<int, std::allocator<int> >& v); 

trabajado para mí con GCC 4.5. No tengo idea por el momento de cómo hacer una solución transparente para el problema de que no se puede tener un argumento predeterminado (también argumento de plantilla) en la declaración y en la definición al mismo tiempo, lo que ... Pero podría ser posible, tal vez cualquiera podría asumir el control desde aquí? :) No lo usaría en el código de producción, creo, pero parece un ejercicio interesante.

+4

Desafortunadamente, es ilegal agregar cosas al espacio de nombres 'std'. – fredoverflow

+3

Los demonios de nariz vendrán y lo arrestarán –

+1

Ese no es el único problema. Las implementaciones son libres de agregar parámetros de plantilla a las clases estándar si son opcionales. Entonces su código simplemente no cumple con los estándares. – wilhelmtell

-1

Con iosfwd es posible hacerlo porque solo hay dos tipos para los que se deben crear instancias de las plantillas: char y wchar_t. Entonces, lo que obtienes al final son declaraciones avanzadas de tipo concreto concretado. Por otro lado, se supone que los contenedores STL funcionan con cualquier tipo, por lo que no hay nada explícito en los encabezados STL.

+1

'' forward-declara las plantillas, no las instancias. La declaración directa de una instanciación de plantilla no tiene sentido ya que no es algo que puedas declarar en primer lugar; solo los nuevos nombres pueden ser 'declarados'. Reenviar-declaración de los contenedores estándar es técnicamente posible, simplemente no es requerido por el estándar y no está permitido en el código de usuario. Por ejemplo, suponiendo que la plantilla 'vector' es exactamente como se especificó, la siguiente sería una declaración directa:' namespace std {template class vector; } ' – boycy

Cuestiones relacionadas