Eventuali duplicati:
Where and why do I have to put the “template” and “typename” keywords?.template (dot-template) utilizzo costruzione
ho incontrato uno strano segmento di codice:
#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;
}
E ' non compilato senza .template parola chiave in funzione printElement. Non l'ho mai visto prima e non capisco per cosa è necessario. Cercando di rimuoverlo, ho ricevuto un sacco di errori di compilazione relativi ai modelli. Quindi la mia domanda è quando viene usata una tale costruzione? È comune?
Solo per la cronaca, non è un '.template' (un singolo punto-template costrutto), ma due token, un punto, seguito dalla parola chiave 'template'. Sarebbe stato anche legale scrivere "c. template GetValue '. Il 'template' è legato alla funzione membro' GetValue', non al punto. – jalf