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 ;-).
fonte
2009-07-14 02:08:10
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