2012-04-17 20 views
7

codice di esempio indicato di seguito non è compilato in g ++. ma sta lavorando su Visual Studio. è possibile utilizzare la funzione di membro Template all'interno della classe template in g ++Perché questo codice non viene compilato in g ++

class Impl 
{ 
public: 
     template<class I> 
     void Foo(I* i) 
     { 

     } 
}; 

template<class C> 
class D 
{ 
public: 
     C c; 
     void Bar() 
     { 
       int t = 0; 
       c.Foo<int>(&t); 
     } 
}; 

int main() 
{ 
     D<Impl> d; 
     d.Bar(); 
     return 0; 
} 
+5

Quali sono gli errori che stai vedendo? – Nick

risposta

9

Perché il l'istruzione in questione dipende da un parametro del modello, al compilatore non è consentito introspettare C fino alla creazione di istanze. Devi dirgli che si intende un modello di funzione:

c.template Foo<int>(&t); 

Se non metti template lì, la dichiarazione è ambigua. Per capire, immaginare il seguente C:

class C { const int Foo = 5; }; 
... 
c.Foo<int>(&t); 

Sembra al compilatore come se si confronta una const int a un int, e confrontando il risultato di quella a qualche indirizzo di &t: (c.Foo<int) > &t.

La vera soluzione però è quella di omettere l'argomento modello esplicito nella chiamata di funzione, e solo fare:

c.Foo(&t); 

Questo è corretto, anche nel caso in cui tale C ha un membro non-modello funzione Foo(int). Generalmente, scrivi il codice del modello con il minor numero di ipotesi possibili (ma non meno).

4

Foo() è un nome di modello-dipendente, quindi è necessario mettere template davanti alla invocazione:

template<class C> 
void D<C>::Bar() 
{ 
    int t = 0; 
    c.template Foo(&t); 
} 
+0

thanks.it sta lavorando. – nsa

+0

Puoi anche omettere '', risultante in 'c.Foo (& t)'. Anche questo dovrebbe funzionare. – evnu

+0

@evnu Sì a omettere il '' (come ho fatto nella mia risposta), no a non lasciare il 'template' (come hai fatto nel tuo commento). –

Problemi correlati