2010-05-18 9 views
8

Tengo el siguiente código:no puede referirse a un nombre de plantilla anidada en un parámetro de plantilla

template <typename Provider> 
inline void use() 
{ 
    typedef Provider::Data<int> D; 
} 

Dónde estoy básicamente tratando de utilizar un miembro de clase de plantilla 'Datos' de alguna clase 'Proveedor', aplicado a 'int', pero obtengo los siguientes errores:

util.cpp:5: error: expected init-declarator before '<' token 
util.cpp:5: error: expected `,' or `;' before '<' token 

Estoy usando GCC 4.3.3 en un sistema Solaris.

+0

posible duplicado de [C++ función de miembro de la plantilla de clase de plantilla llamada de función de plantilla] (http://stackoverflow.com/questions/1840253/c-template -member-function-of-template-class-called-from-template-function) –

+1

@Kirill: Creo que este es único ya que requiere tanto 'typename' como' template'. (Luché por un tiempo sobre cómo explicar esto usando el mismo código y no estoy satisfecho.) – sbi

+0

@sbi, sí, esto no es exactamente lo mismo, pero es una pregunta muy similar. –

Respuesta

16
typedef typename Provider::template Data<int> D; 

El problema es que, cuando se analiza sintácticamente los compiladores use() por primera vez, que no sabe Provider, por lo que no sabe lo que se refiere a Provider::Data. Podría ser un miembro de datos estáticos, el nombre de una función miembro u otra cosa. Es por eso que debe ingresar el typename.
El adicional template es necesario siempre que el nombre anidado sea el nombre de una plantilla. Si fuera otra cosa, entonces Data < ... podría ser una comparación.

+0

Funciona. ¡Gracias! – chila

8

Se necesita un typename y una template:

template <typename Provider> 
inline void use() 
{ 
    typedef typename Provider::template Data<int> D; 
} 
+0

Gracias a ti también. – chila

Cuestiones relacionadas