2012-10-01 25 views
23

Eventuali duplicati:
C++ template member function of template class called from template functionCome chiamare una funzione membro template?

template<class T1> 
class A 
{ 
public: 
    template<class T0> 
    void foo() const {} 
}; 

template<class T0,class T1> 
void bar(const A<T1>& b) 
{ 
    b.foo<T0>(); // This throws " expected primary-expression before ‘>’ token" 
} 

posso cambiarlo per

b->A<T1>::template foo<T0>(); 

che compila bene. Tuttavia posso anche cambiarlo a

b.A<T1>::template foo<T0>(); 

che compila anche bene. eh?

Come si fa correttamente chiamare la funzione di membro template nel senso del codice originale?

+0

noi conosciamo che cosa le due affermazioni che effettivamente compilare è significano? In questo esempio "cotto down" compilano, ma nel mio programma vero questa non viene compilato. – ritter

risposta

37

appena trovato:

Secondo C++ '03 standard 14,2/4:

Quando il nome di una specializzazione template membro appare dopo . o -> in un suffisso-espressione, o dopo nested-nome-identificatore in un qualificato-id, e il suffisso-espressione o qualificata id dipende in modo esplicito su un modello-parametro (14.6.2), il nome del modello membro devono essere preceduti dalla parola chiave template. Altrimenti si suppone che il nome indichi un non-modello.

codice corretto è:

b.template foo<T0>(); 
+1

E questo è fatto per lo stesso motivo e in condizioni simili a quando 'typename' è necessario. – bames53

10

è possibile chiamare la funzione in questo modo:

b.template foo<T0>(); 
Problemi correlati