2012-03-14 9 views
6
struct Messages 
{ 
     template <typename V> 
     static const char* message() {return "test mesage";} 
}; 

template <int Min, class M=Messages> 
struct Test: public M 
{ 
    Test() 
    { 
     M::message<int>(); //error: expected primary-expression before 'int' 
    } 
}; 

int main() 
{ 
    Test<5, Messages> t; 
} 

Sospecho que esto tiene que ver con alguna dependencia mutua, como el código de Prueba depende de la clase base M cuyo método está especializado en el interior Prueba. ¿Es esto correcto?¿Por qué no puedo llamar a un método con plantilla de una clase de plantilla que se deriva de

Respuesta

7

M::message es un nombre dependiente ya que M es un argumento de plantilla. El compilador no puede saber que un nombre dependiente es en sí misma una plantilla, por lo tanto, es necesario especificar de forma explícita:

M::template message<int>(); 

De lo contrario el compilador analiza el código como si M::message eran un valor, lo que da siguiente Soportes en ángulo de un significado diferente (es decir, se analizan como operadores de menor que y mayor que y no como delimitadores de lista de plantilla). El compilador no puede recuperarse de un análisis incorrecto.

+0

Gracias, eso es todo. No conocía este uso de la palabra clave 'plantilla' para desambiguar los nombres dependientes. –

Cuestiones relacionadas