2011-04-02 13 views
7

Tengo un problema con el siguiente código:typedef dentro clase de plantilla no funciona

template <typename U> 
class lamePtr 
{ 
public: 
    typedef U* ptr; 
}; 

template <typename U> 
class smarterPointer 
{ 
    public: 
    void funFun() 
    { 
     typedef lamePtr<U> someType; 
     someType::ptr query; 
    } 
}; 

Como se puede ver, tengo un typedef dentro lamePtr. Dentro de la clase smarterPointer tengo una función funFun(). Lo que estoy tratando de hacer es hacer otro typedef someType. Hasta esa línea, todo funciona bien hasta que lleguemos a la línea con la consulta someType :: ptr.

Lo que quiero que ocurra aquí es que "query" se convertirá en lamePtr < U> :: ptr (un valor simple, no un typedef;). Sin embargo, tengo errores de compilación (con gcc 4.4.3):

temp.cpp: In member function ‘void smarterPointer&ltU>::funFun()’: 
temp.cpp:15: error: expected ‘;’ before ‘query’

¿Qué estoy haciendo mal aquí?

+0

relacionada, con una gran cantidad de información acerca de por qué se necesita el 'typename': [? ¿De dónde y por qué tengo que poner' 'template' y typename' sobre los nombres de dependientes] (http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-template-and-typename-on-dependent-names) –

+1

En el futuro, no intente formatear su código con etiquetas html. Simplemente ingrésalo tal como está, selecciónalo y haz clic en el botón '{}'. –

+0

Gracias, lo tendré en cuenta para el futuro. Gracias por la referencia James, voy a pasar un tiempo en eso – Melon

Respuesta

12

someType, as lamePtr<U> es un "nombre dependiente". Depende de qué U sea si hay o no un miembro ptr y, de ser así, qué tipo de "cosa" es ese miembro.

Por supuesto, que saben que para todos T, lamePtr<T>::ptr es un tipo, pero en esta etapa de la compilación del programa de análisis no sabe eso.

Use the typename keyword para indicarle al analizador que es un tipo. El resto se resolverá más adelante en el proceso de compilación. Solo un pequeño capricho de C++.

template <typename U> 
class lamePtr 
{ 
public: 
    typedef U* ptr; 
}; 

template <typename U> 
class smarterPointer 
{ 
    public: 
    void funFun() 
    { 
     typedef lamePtr<U> someType; 
     typename someType::ptr query; 
    } 
}; 
+0

Funciona como un encanto [; – Melon

+0

@ Melon: No hay problema :) –

9

Necesita la palabra clave typename para indicar que someType::ptr es un tipo.

typename someType::ptr query; 

Ver Officially, what is typename for? para más información.

+0

Gracias, eso funcionó. Sin duda tendré que leer más acerca de los nombres tipo, gracias por la solución y el enlace – Melon

+0

@ Melón: Más material de lectura si está interesado: http://www.comeaucomputing.com/techtalk/templates/#typename – ildjarn

Cuestiones relacionadas