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?
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