IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Erreurs de syntaxe sur une bibliothèque header-only


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Erreurs de syntaxe sur une bibliothèque header-only
    Bonjour !

    Dans l'optique de créer correctement des matrices 2D j'ai récemment trouvé une bibliothèque header-only qui convenait parfaitement à mes besoins

    Cependant lors de la compilation j'obtiens énormes d'erreurs que je suppose être de syntaxe, situées dans le header de la bibliothèque, ce qui m'étonne, même si je ne suis pas encore renseigné sur la syntaxe relative à l'écriture de bibliothèques header-only

    La bibliothèque utilisée : https://github.com/r-barnes/grid_engine

    La liste d'erreurs ( donnée par Visual Studio 2017 Community ) :

    Gravité Code Description Projet Fichier Ligne
    Erreur C2238 jetons inattendus avant ';' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 171
    Erreur C2061 erreur de syntaxe*: identificateur 'nparser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 169
    Erreur C2238 jetons inattendus avant ';' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 169
    Erreur C2061 erreur de syntaxe*: identificateur 'nparser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 171
    Erreur C2061 erreur de syntaxe*: identificateur 'nparser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 173
    Erreur C2238 jetons inattendus avant ';' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 173
    Erreur C2061 erreur de syntaxe*: identificateur 'nparser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 175
    Erreur C2238 jetons inattendus avant ';' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 175
    Erreur C2061 erreur de syntaxe*: identificateur 'nparser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 177
    Erreur C2238 jetons inattendus avant ';' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 177
    Erreur C2061 erreur de syntaxe*: identificateur 'nparser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 179
    Erreur C2238 jetons inattendus avant ';' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 179
    Erreur C2270 'hexring'*: modificateurs non autorisés sur les fonctions non membres Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 472
    Erreur C2270 'd8ring'*: modificateurs non autorisés sur les fonctions non membres Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 482
    Erreur C2270 'd4ring'*: modificateurs non autorisés sur les fonctions non membres Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 489
    Erreur C2270 'hextring'*: modificateurs non autorisés sur les fonctions non membres Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 496
    Erreur C2270 'd8tring'*: modificateurs non autorisés sur les fonctions non membres Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 506
    Erreur C2270 'd4tring'*: modificateurs non autorisés sur les fonctions non membres Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 513
    Erreur C2079 'i' utilise une class de 'grid_engine::grid_engine<int>::parser' non défini Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 10
    Erreur C2027 utilisation du type non défini 'grid_engine::grid_engine<int>::parser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 10
    Erreur C2228 la partie gauche de '.good' doit avoir un class/struct/union Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 10
    Erreur C2100 indirection non conforme Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 11
    Erreur C2079 'i' utilise une class de 'grid_engine::grid_engine<int>::parser' non défini Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 13
    Erreur C2027 utilisation du type non défini 'grid_engine::grid_engine<int>::parser' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 13
    Erreur C2228 la partie gauche de '.good' doit avoir un class/struct/union Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 13
    Erreur C2100 indirection non conforme Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 14
    Erreur C2088 '<<'*: non conforme pour class Test c:\users\lppen\documents\visual studio 2017\projects\test\test\main.cpp 14
    Le code utilisé pour le test ( la syntaxe est à priori correcte ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include "grid_engine.hpp"
    #include <iostream>
     
    int main() {
     
    	typedef grid_engine::grid_engine<int> gtype;
     
    	gtype grid1(40, 40);
     
    	for (gtype::parser i = grid1.begin(); i.good(); ++i)
    		*i = rand();
     
    	for (gtype::parser i = grid1.begin(); i.good(); ++i)
    		std::cout << *i << std::endl;
    }
    Le header est-il écrit de manière incorrecte ou le problème vient-il de moi ?

    Merci d'avance pour vos retours !

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    première erreur:
    Erreur C2238 jetons inattendus avant ';' Test c:\users\lppen\documents\visual studio 2017\projects\test\test\grid_engine.hpp 171

    Ca, c'est dans ton header.
    Au moins les lignes 171 et 170 sont extrèmement suspectes.
    Les autres erreurs peuvent être de faux positifs provoqués par la première.

    Sans code du header, on ne pourra pas t'aider.

    Ton main semble raisonnablement valable.
    A part que tu n'as pas appelé srand(...) avant rand(), et que tu utilises rand() au lieu des fonctions du C++11 (norme d'il y a déjà 6 ans, supportées par tous les compilateurs classiques depuis plusieurs versions)

    Tu devrais avoir un end() quelconque, tel que la comparaison entre un iterateur i et end retourne i.good()
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Visual C++ a parfaitement raison de se plaindre de grid_enginec.hpp:169, car elle est illicite. Les versions précédant Visual C++ 17 acceptaient à tord ce code.

    Depuis VC17, la compilation des templates en deux passes est enfin respectée par le compilateur de Microsoft. Une passe en template parameters independant, puis une passe en template parameters dependant. La première passe est faite lorsque la classe ou fonction template est définie. À ce stade, le compilateur ne sais pas ce que représenteront les parametres template, et il est donc impossible de parser tout ce qui en dépend.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<class T>
    struct A
    {
        typedef T token;
    };
     
    template<class T>
    struct B
    {
        typedef A<T>::token type; // invalide
    };
    Lorsque le compilateur parse pour la première fois B<T> il n'a aucune idée de ce qu'est T, et à plus forte raison A<T>, et à plus forte raison A<T>::token. Ça peut être un type, mais ça peut aussi être une valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    template<class T>
    struct A
    {
        typedef T token;
    };
     
    template<class T>
    struct B
    {
        typedef A<T>::token type;
    };
     
    template<>
    struct A<int>
    {
        static const int token = 0; // on specialise A<int> de sorte que pour T=int, A<T>::token n'est plus un type, mais un entier valant zero
    };
     
    B<int> b;
    On voit ci-dessus qu'on a specifié A<int> de telle sorte que A<T>::token soit non pas un type mais un entier de valeur 0. Ainsi, dans ce cas, typedef A<T>::token type; n'a plus aucun sens. Revenons donc à notre première passe, comme démontré à l'instant, le compilateur ne peut pas savoir ce que représente les identifiers ayant trait à T. Il est donc obligé de refuser tout code qui fait la supposition implicite de ce qu'ils peuvent représenter.

    Une solution pour le développeur est de préciser explicitement au compilateur ce qu'est un identifier, avec le mot clé typename :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<class T>
    struct A
    {
        typedef T token;
    };
     
    template<class T>
    struct B
    {
        typedef typename A<T>::token type; // valide
    };
    Ici, le développeur dit au compilateur : "A<T>::token doit être un type. Si ce n'est pas le cas rejette le code. Merci." Le compilateur peut donc continuer sa route.

    Viens ensuite le moment où la classe template est utilisée, il va donc y avoir ce qu'on appelle instanciation :

    À ce stade, le compilateur effectue sa seconde passe, en contexte déduit, c'est le template parameters dependant lookup. Il sait maintenant ce que vaut T: int.
    Conclusion : je suppose que cette bibliothèque (grid_engine) n'a été testée que sur le compilateur de microsoft dans les version passées. Elle devra être modifiée.
    -- Yankel Scialom

Discussions similaires

  1. [MySQL] Erreur de syntaxe sur une requête
    Par nO_life dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 06/03/2009, 12h34
  2. Erreur de syntaxe sur une requête d'insertion
    Par Moustic74 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/12/2008, 17h34
  3. Erreur de syntaxe sur une Requete Update
    Par samtheh dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 01/06/2007, 13h07
  4. javascript/ erreur de syntaxe sur une ligne inexistante
    Par geocassetout dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/05/2007, 12h35
  5. Erreur de syntaxe sur une requête paramétrée
    Par deglingo37 dans le forum Access
    Réponses: 5
    Dernier message: 16/05/2006, 22h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo