2010-10-17 14 views
18

Je reçois une erreur <: impossible de démarrer une liste d'arguments de modèle dans le compilateur g ++. Code<: impossible de démarrer une liste d'arguments de modèle

template<typename T> class SomeClass; 
class Class; 

SomeClass<::Class>* cls; 
+1

Le nouveau standrard (C++ 0x) aborde la question de >> comme dans un >. Cela ne règle-t-il pas également ce problème? Incidemment, les compilateurs Micorosoft ne donnent pas d'erreur sur ce point (je sais qu'ils devraient techniquement, mais c'est bon qu'ils ne le font pas) –

+0

@ArmenTsirunyan oui, cela a été corrigé en C++ 0x qui est devenu C++ 11 bien que le correctif pour '>>' a été fait dans la section '14.3' qui est différent du correctif pour' <:: 'qui est une modification de la règle du nombre maximal. Donc à la fois ennuyeux mais différents problèmes de base au travail. Je détaille ceci dans ma réponse. –

Répondre

33

Selon le Maximal Munch tokenization principle un jeton C++ valide doit recueillir/avoir autant de caractères consécutifs que possible.

<: est une digraph (une représentation alternative du symbole [).

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

Alors SomeClass<::Class>* cls; est interprété comme SomeClass[:Class>* cls; qui ne fait aucun sens.

Solution: Ajouter un espace entre < et :

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

Essayez ce qui suit à la place:

SomeClass< ::Class>* cls; 

Vous pouvez trouver plus d'informations à propos de this question digraphs. This question sur les trigraphes pourrait être utile aussi.

2

espaces Mettez autour des < caractères:

SomeClass <::Class> * cls; 

Vous ne devez réellement séparer < et:, mais j'aime la symétrie.

+0

plus un pour aimer la symétrie – Mawg

7

Avec C++ 11, la réponse à cette question change un peu.

Pre C++ 11

Avant 11 le maximal munch rule C++ qui est utilisé dans l'analyse lexicale pour éviter les ambiguïtés et travaille en prenant autant d'éléments que possible pour former un jeton valide causé ceci:

<:: 

pour générer les jetons suivantes:

<: : 

<: est un digrap h, ce qui se traduit par [ et si vous vous retrouvez avec:

SomeClass[:Class>* cls; 

qui n'est pas un code valide.

Nous pouvons confirmer que cela est le cas en allant dans le projet de C++ partie standard 2.4Prétraitement jetons qui dit:

Si le flux d'entrée a été analysé en pré-traitement jetons jusqu'à un caractère donné , le prochain jeton de prétraitement est la séquence la plus longue de caractères qui pourraient constituer un jeton de prétraitement, même si entraînerait une défaillance de l'analyse lexicale.

et fournit quelques exemples dont la question Munch maximale classique suivante:

[Exemple: Le fragment de programme x y +++++ est analysée comme x ++ ++ + y, qui, si x et y sont de type intégré, enfreint une contrainte sur les opérateurs d'incrémentation , même si l'analyse x ++ + ++ y peut produire une expression correcte . -end exemple]

C++ 11

En C++ 11 cette modification, une règle a été taillé pour ce cas et draft C++11 standard ajouté ce qui suit:

Dans le cas contraire , si les trois caractères suivants sont < :: et que le caractère suivant n'est ni: ni>, le < est traité comme un jeton de préprocesseur et n'est pas le premier caractère du jeton de remplacement <:.

à l'article 2.5jetons Prétraitement. Donc, ce code ne produira plus et erreur dans C++ 11.

Ce changement est venu de defect report: 1104

Questions connexes