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

Autres éditeurs Discussion :

Erreur de compil avec G++


Sujet :

Autres éditeurs

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut Erreur de compil avec G++
    Bonsoir,

    Un problème tout bête, mais je ne vois vraiment pas d'où ça vient, j'ai pourtant tourné et retourné tout ça sous tous les angles, vérifié si ça ne découlait pas d'une erreur sur les lignes d'avant...

    Le code en résumé :
    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
    20
    21
    template <typename T>
    class sarray {
    	struct node {
    		/* tout un tas de trucs */
    	};
    	/* idem */
    	node* getNode(const T&) const;
    	node* getNodeAt(unsigned) const;
    	void removeNode(node*);
    	/* etc */
    };
     
    template <typename T>
    node* sarray<T>::getNode(const T& e) const { /* ligne 178 */
    	/* definition */
    }
     
    template <typename T>
    node* sarray<T>::getNodeAt(unsigned index) const { /* ligne 189 */
    	/* definition */
    }
    donne ces erreurs, avec gcc 4.1.2, sous linux (une ubuntu 6.10, mais ça on doit s'en moquer pas mal, non ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sarray.h:178: error: expected constructor, destructor, or type conversion before ‘*’ token
    sarray.h:189: error: expected constructor, destructor, or type conversion before ‘*’ token
    Sachant qu'en remplaçant "node*" par "sarray<T>::node*" ne change rien.

    Cela vient-il de gcc 4.1.2 (donc faut il repasser à gcc 3.3.4 ?) ou d'un assemblement tordu de types qui n'auraient pas dû être imbriqués ?

    Merci d'avance pour vos réponses et votre temps

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Il doit falloir mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <typename T>
    sarray<T>::node* sarray<T>::getNode(const T& e) const { /* ligne 178 */
    	/* definition */
    }
    pour indiquer au compilateur comment résoudre le symbole 'node'.

    MAT.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut
    Citation Envoyé par Mat007
    Salut,

    Il doit falloir mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <typename T>
    sarray<T>::node* sarray<T>::getNode(const T& e) const { /* ligne 178 */
    	/* definition */
    }
    pour indiquer au compilateur comment résoudre le symbole 'node'.

    MAT.
    Sachant qu'en remplaçant "node*" par "sarray<T>::node*" ne change rien.
    Déjà essayé, ça ne change rien. Pour lui, sarray<T>::node n'existe pas dans l'environnement global. Peut être parce qu'il est private dans sarray<T> ?

    J'imagine qu'en mettant la définition lors de la déclaration, dans la déclaration de la classe, le compilateur ne broncherait plus. Mais ce serait aussi un peu moche.

  4. #4
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Avec typename ça devrait passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <typename T>
    typename sarray<T>::node* sarray<T>::getNode(const T& e) const {
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut
    En effet, ça a l'air de passer.

    J'ai par contre un autre bug étrange, il me sort à l'utilisation d'une de mes classes que le nom de la classe est une référence vers une fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g++ -c -I/usr/include -o main.o main.cpp
    main.cpp: In function ‘int main(int, char**)’:
    main.cpp:8: error: expected `;' before ‘b’
    main.cpp:8: warning: statement is a reference, not call, to function ‘random’
    main.cpp:10: error: ‘b’ was not declared in this scope
    Avec random :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class random {
    	/* membres privés */
    public:
    	random();
    	~random();
    	unsigned int operator()();
    };
    et le main :
    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
    20
    #include <iostream>
     
    #include "sarray.h"
    #include "random.h"
     
    int main(int argc, char** argv) {
    	sarray<unsigned> a;
    	random b;
    	for (unsigned i = 0; i < 1000; ++i) {
    		unsigned c = b();
    		if (a.contains(c)) {
    			std::cout << "* removing " << c << std::endl;
    			a.insert(c);
    		} else {
    			std::cout << " inserting " << c << std::endl;
    			a.remove(c);
    		}
    	}
    	return 0;
    }

  6. #6
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Appelle là Random au lieu de random pour voir

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut
    Tellement aigri je suis...

    J'avais déjà essayé en renommant en "rand" puis en "grand", ça faisait pareil. Là, Random marche.
    Ce que je ne comprends pas c'est pourquoi ces fonctions seraient déclarées dans iostream (le seul machin que j'inclus avant) ET en dehors de std::...

    Peu importe.

    Merci beaucoup pour ces deux réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de compilation avec Excel_2k
    Par Debure dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/06/2006, 14h51
  2. Erreur de compilation avec APRO
    Par netchip dans le forum Langage
    Réponses: 1
    Dernier message: 22/04/2006, 23h12
  3. Erreur de compil avec Outp
    Par sixon dans le forum C++
    Réponses: 2
    Dernier message: 27/02/2006, 15h01
  4. Erreur de compilation avec SWITCH et CASE
    Par barbarello dans le forum C++
    Réponses: 4
    Dernier message: 21/01/2006, 21h47
  5. [FreePascal]Erreur de compilation avec Dev-Pascal
    Par youngeikichi dans le forum Free Pascal
    Réponses: 3
    Dernier message: 17/02/2005, 14h22

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