2011-12-11 25 views
32

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?

+8

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

risposta

40

GetValue è un nome dipendente, e quindi è necessario dire esplicitamente al compilatore che ciò che segue è una funzione cmodello, non alcuni dati dei membri. Questo è il motivo per cui è necessario scrivere la parola chiave template per disambigarla.

Senza template parola chiave, i seguenti

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

potrebbe essere interpretata come:

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

cioè il < viene interpretato come operatore minore, e > viene interpretato come maggiore di operatore. L'interpretazione di cui sopra è ovviamente errata, in quanto non ha senso e, pertanto, comporterebbe un errore di compilazione.

Per ulteriori dettagli spiegazione, leggere la risposta accettata qui:

Problemi correlati