2011-04-06 20 views
5

¿Qué pasa con lo siguiente?typedef a tipo de plantilla

typedef boost::shared_ptr SharedPtr; 

GCC da el siguiente error:

ISO C++ forbids declaration of ‘shared_ptr’ with no type

+1

¿Qué está tratando de lograr? –

+0

Mi error, typename no debería estar ahí, pero ninguna de las respuestas existentes se ve afectada por esto. –

+1

¿Ese código no es válido? ¡Nunca lo supe! +1 – Mehrdad

Respuesta

6

C++ no (todavía) no tiene "typedefs plantilla" donde se puede "cambiar el nombre de" una plantilla como esta. Esta es una característica que se agrega en C++ 0x, donde tal "typedef" se llama una "plantilla de alias".

La solución más simple que funciona en la actualidad es el uso de una plantilla de clase con un typedef anidada:

template <typename T> 
struct SharedPtr 
{ 
    typedef std::shared_ptr<T> Type; 
}; 

// usage 
typename SharedPtr<int>::Type sp; 
+0

¿Puede explicar por qué no es válido en C++ actual? Parece un poco molesto que no lo sea, y sugiere un comportamiento obvio. –

+0

@Matt: Simplemente no es una característica del lenguaje en C++ 98/C++ 03. Estoy de acuerdo en que es molesto: C++ tiene muchas molestias y afortunadamente muchas de ellas han sido rectificadas en C++ 0x. –

+0

La razón es que shared_ptr no es un tipo, sino una ** plantilla ** para un tipo. Por otro lado, 'shared_ptr ' es un tipo y se puede usar en un typedef. –

Cuestiones relacionadas