2011-12-11 8 views
32

Duplicar posibles:
Where and why do I have to put the “template” and “typename” keywords?.template (punto-plantilla) el uso de la construcción

Me he encontrado con un segmento extraño de código:

#include <iostream> 

template <int N> 
struct Collection { 
    int data[N]; 

    Collection() { 
    for(int i = 0; i < N; ++i) { 
     data[i] = 0; 
    } 
    }; 

    void SetValue(int v) { 
    for(int i = 0; i < N; ++i) { 
     data[i] = v; 
    } 
    }; 

    template <int I> 
    int GetValue(void) const { 
    return data[I]; 
    }; 
}; 

template <int N, int I> 
void printElement(Collection<N> const & c) { 
    std::cout << c.template GetValue<I>() << std::endl; /// doesn't compile without ".template" 
} 

int main() { 
    Collection<10> myc; 
    myc.SetValue(5); 
    printElement<10, 2>(myc); 
    return 0; 
} 

Es no compilado sin .template palabra clave en Función printElement. Nunca he visto esto antes y no entiendo para qué se necesita. Al tratar de eliminarlo, obtuve muchos errores de compilación relacionados con la plantilla. ¿Entonces mi pregunta es cuando se usa una construcción como esa? ¿Es común?

+8

Sólo para que conste, que no es un '.template' (una sola construcción de puntos y plantilla), pero dos tokens, un punto, seguido de la palabra clave 'template'. También habría sido legal escribir 'c. plantilla GetValue '. La 'plantilla' está ligada a la función miembro' GetValue', no al punto. – jalf

Respuesta

40

GetValue es un nombre dependiente, y por lo que deberá indicar explícitamente al compilador que lo que sigue es una c plantilla de función, no algunos datos de los miembros. Es por eso que necesita escribir la palabra clave template para desambiguar esto.

Sin template palabra clave, los siguientes

c.GetValue<I>() //without template keyword 

podría interpretarse como:

//GetValue is interpreted as member data, comparing it with I, using < operator 
((c.GetValue) < I) >() //attempting to make it a boolean expression 

que es, la < se interpreta como operador menor que, y > se interpreta como mayor que operador. La interpretación anterior es, por supuesto, incorrecta, ya que no tiene sentido, y por lo tanto, daría lugar a un error de compilación.

Para más explicación detallada, lea la respuesta aceptada aquí:

Cuestiones relacionadas