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;
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;
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
spazi mettere intorno i < personaggi:
SomeClass <::Class> * cls;
Hai solo effettivamente bisogno di separare < e:, ma mi piace la simmetria.
più uno per gradimento simmetria – Mawg
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.4
pre-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.5
Preprocessing gettoni. Quindi questo codice non produrrà più errori in C++ 11.
Questo cambiamento è venuto da defect report: 1104
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) –
@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. –