2009-07-14 14 views
13
template<class T> 
class Set 
{ 
public: 
    void insert(const T& item); 
    void remove(const T& item); 
private: 
    std::list<T> rep; 
} 

template<typename T> 
void Set<T>::remove(const T& item) 
{ 
    typename std::list<T>::iterator it = // question here 
    std::find(rep.begin(),rep.end(),itme); 
    if(it!=rep.end()) rep.erase(it); 

} 

Perché è necessario il nome typ in remove()?Perché abbiamo bisogno di typename qui?

+0

Forse modificare per rendere più chiaro che la linea di cui stai parlando è typname std :: list :: iterator it = std :: find (rep.begin(), rep.end(), itme); poiché penso che sia la tua intenzione. – aem

risposta

18

In generale, C++ ha bisogno typename a causa della sfortunata sintassi [*] eredita dal C, che rende impossibile senza informazioni non-locale per dire - per esempio - in A * B; se i nomi A un tipo (in cui caso questa è una dichiarazione di B come puntatore ad esso) o no (nel qual caso questa è un'espressione di moltiplicazione - del tutto possibile dal A, per tutto quello che puoi dire senza informazioni non locali, potrebbe essere un'istanza di una classe che sovraccarichi operator* per fare qualcosa di strano ;-).

Nella maggior parte dei casi il compilatore ha le informazioni non locali necessarie per disambiguare (sebbene la sfortunata sintassi significhi ancora che il parser di basso livello ha bisogno di feedback dal livello superiore che mantiene le informazioni sulla tabella dei simboli) ... ma con i modelli non è (non in generale, anche se in questo caso specifico potrebbe essere tecnicamente illegale specializzare uno std::list<T> in modo che il suo ::iterator NON sia un nome di tipo ;-).

[*] non solo la mia opinione, ma anche l'opinione di Ken Thompson e Rob Pikes, attualmente i miei colleghi, che sono impegnati a progettare e implementare un nuovo linguaggio di programmazione per uso interno: quel nuovo linguaggio di programmazione, mentre la sua sintassi è per lo più C-like, NON ripete gli errori di progettazione della sintassi di C - è la nuova lingua (come ad esempio nel buon vecchio Pascal), la sintassi è sufficiente per distinguere gli identificatori che devono nominare un tipo da quelli che non devono ;-).

+1

l'iteratore potrebbe potenzialmente essere una variabile membro statica. E per impostazione predefinita è stato il compilatore a pensarlo. Quindi l'errore del compilatore. –

+0

Ritengo che confermare o meno che la lingua sia definita "B ++" sarebbe una grave violazione della riservatezza commerciale? ;-) –

+0

Mi dispiace di averlo riportato dalla morte, ma dopo 8 anni sono curioso di sapere se ci sono ulteriori informazioni di qualsiasi tipo che puoi divulgare su quel linguaggio di programmazione. Anche se non sto trattenendo il respiro. – Cebtenzzre

0

Penso che in generale sia necessario sia il typename/class T nella dichiarazione di classe sia le definizioni di funzioni in quanto è possibile definire specifiche di modello complete/parziali per le definizioni di funzione. Vale a dire. potresti specializzare la tua funzione di rimozione per interi, stringhe, qualunque cosa accada. Quindi in questo caso stai dicendo al compilatore "Questo è il modello generale, per qualsiasi tipo", quindi in seguito potresti definire la stessa funzione specificata per i soli numeri interi.

+0

Ahh questa risposta non è valida con questo chiarimento, mi dispiace! – DeusAduro

12

Se si sta parlando di typename utilizzato con std::list<T>::iterator:

TypeName viene utilizzato per chiarire che iterator è un tipo definito nella classe std::list<T>. Senza nome tipo, std::list<T>::iterator verrà considerato un membro statico. typename viene utilizzato ogni volta che un nome che dipende da un parametro del modello è un tipo.

+0

+1 Spiegazione sorprendente! – AraK

1

typename è necessario nella dichiarazione di "it" perché altrimenti il ​​compilatore non sa che si tratta di una dichiarazione di tipo piuttosto che di un'espressione.

Secondo this page, "Utilizzare la parola chiave typename se si dispone di un nome qualificato che fa riferimento a un tipo e dipende da un parametro del modello."

Problemi correlati