2015-01-18 15 views
5

È possibile utilizzare la parola chiave template quando ottenere un nome di modello da un namespace globale:C'è mai un motivo per usare ":: template"?

template <class T> void function_template(); 

template <class T> 
void h() 
{ 
    ::template function_template<T>(); 
} 

int main() { h<int>(); } 

Ma questo codice può compilare senza di essa. Quali sono le situazioni in cui si potrebbe voler fare questo?

+0

@KerrekSB Ma 'function_template' è un membro del * spazio dei nomi globale * e questo codice può essere compilato senza di esso. –

+0

Oh, scusa, intendi in particolare la versione globale - non importa poi. –

risposta

8

mi viene in mente un posto, ma non credo che sarebbe stato comune:

#include <iostream> 

// simpile function template 
template<class T> 
void function_template(T) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

// overload (NOT specialized) 
void function_template(int value) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

int main() 
{ 
    function_template(0);    // calls overload 
    ::function_template(0);    // calls overload 
    ::template function_template(0); // calls template, deduces T 
} 

uscita

void function_template(int) 
void function_template(int) 
void function_template(T) [T = int] 

stavo andando a riempire un po 'di questo in un namespace anonimo in realtà portano un significato non banale a :: ma questo sembra essere sufficiente, quindi l'ho lasciato fuori.

+0

[temp.names]/p5 dice "Un nome preceduto dalla parola chiave' template' deve essere un * template-id * o il nome deve fare riferimento a un modello di classe. " ':: template function_template' non è né, quindi dovrebbe essere mal formato. –

Problemi correlati