2010-10-17 9 views
18

Viene visualizzato un errore <: impossibile avviare un elenco di argomenti del modello sul compilatore g ++. Codice<: impossibile iniziare un elenco di argomenti modello

template<typename T> class SomeClass; 
class Class; 

SomeClass<::Class>* cls; 
+1

Il nuovo standrard (C++ 0x) affronta la questione della >> come in un >. Non affronta anche questo problema? Per inciso, i compilatori Micorosoft non danno errori (so che tecnicamente dovrebbero, ma è buono che non lo siano) –

+0

@ArmenTsirunyan sì, questo è stato risolto in C++ 0x che divenne C++ 11 anche se la correzione per '>>' è stato fatto nella sezione '14.3' che è diversa dalla correzione per' <:: 'che è una modifica della regola molto più grande. Quindi sia fastidiosi, ma diversi problemi chiave al lavoro. Lo dettaglio nella mia risposta. –

risposta

33

Secondo il Maximal Munch tokenization principle un gettone valido C++ deve raccogliere/avere il maggior numero di caratteri consecutivi possibili.

<: è un digraph (una rappresentazione alternativa del simbolo [).

      Digraph Equivalent 
           <:   [ 
           :>   ] 
           <%   { 
           %>   } 
           %:   # 

Così SomeClass<::Class>* cls; viene interpretato come SomeClass[:Class>* cls;, che non ha alcun senso.

Soluzione: Aggiungere uno spazio bianco tra il < e :

SomeClass< ::Class>* cls; 
      ^
      | 
      White Space 
11

Prova il seguente invece:

SomeClass< ::Class>* cls; 

È possibile trovare maggiori informazioni in this domanda su digrammi. Anche la domanda This sui trigrafi potrebbe essere utile.

2

spazi mettere intorno i < personaggi:

SomeClass <::Class> * cls; 

Hai solo effettivamente bisogno di separare < e:, ma mi piace la simmetria.

+0

più uno per gradimento simmetria – Mawg

7

Con C++ 11 la risposta a questa domanda cambia leggermente.

Pre C++ 11

precedente per C++ 11 il maximal munch rule che viene utilizzato in analisi lessicale per evitare ambiguità e lavora prendendo come molti elementi come il possibile per formare un gettone valida causato questo:

<:: 

per generare i seguenti token come:

<: : 

<: è un digrap h che si traduce in [ e così si finisce con:

SomeClass[:Class>* cls; 

che non è un codice valido.

Possiamo confermare che questo è il caso andando al progetto C++ sezione standard 2.4pre-elaborazione gettoni che dice:

Se il flusso di input è stato analizzato in pre-elaborazione gettoni fino ad un determinato carattere , il successivo token di preelaborazione è la sequenza più lunga di caratteri che potrebbe costituire un token di preelaborazione, anche se che potrebbe causare il fallimento di un'ulteriore analisi lessicale.

e fornisce alcuni esempi tra cui massima classica domanda munch:

[Esempio: Il frammento di programma x +++++ y viene analizzata come x ++ ++ + y, che, se xey sono di tipo built-in, viola un vincolo sugli operatori di incremento , anche se l'analisi x ++ + ++ y potrebbe produrre un'espressione corretta . -end esempio]

C++ 11

In C++ 11 questo cambia, una regola stato ritagliato per questo caso e il draft C++11 standard aggiunto il seguente:

Altrimenti , se i successivi tre caratteri sono < :: e il successivo carattere non è né: né>, lo < viene considerato come un token di preprocessore da solo e non come il primo carattere del token alternativo <:.

alla sezione 2.5Preprocessing gettoni. Quindi questo codice non produrrà più errori in C++ 11.

Questo cambiamento è venuto da defect report: 1104

Problemi correlati