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

Langage C++ Discussion :

erreur d'affichage dans template


Sujet :

Langage C++

  1. #1
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut erreur d'affichage dans template
    Bonsoir a tous
    j'ai modifié mon post car je viens d'avoir un nouveau soucis.

    j'ai le probleme suivant quand je veux afficher les objet PieceMuseeArt que j'encode et je parcous à l'aide de mon itérateur, à l'affichage il m'affiche tous les parametres par defaut de la PieceMuseeArt sans qu'il prenne en considération ce que je lui ai encodé.
    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
     
    int main()
    {
    	int i;
    	cout<<"combien delement voulez vous"<<endl;
    	cin>>i;
    	Personne per;
    	PieceMuseeArt p;
    	p.Encode();
    	TVecteur<PieceMuseeArt>vpm(i);
    	cout<<"fini";
    	vpm.ajout(&p);
    	vpm.affContenu();
     
     
    }
    la methode Encode
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    PieceMusee& PieceMuseeArt::Encode()
    {
    	PieceMuseeArt pmar;
     
     
         	cout<<"--------------Encodage de la piece-----------"<<endl;
     
    	Identifiant i;
    	char l;int a;
    	cout<<"Inserer la lettre de l'id alphanumerique de la piece: ";
    	cin>>l;
    	i.setLettre(l);
    	this->id.setLettre(l);
    	cout<<"Quelle est son annee d acquisition?";
    	cin>>a;
    	i.setAnnee_dacq(a);
    	this->id.setAnnee_dacq(a);
     
    	pmar.setIdentifiant(i);
     
    	cout<<"l'id avec la surcharge de <<"<<i<<endl;
    	cout<<"l'id avec surcharge de = "<<pmar.id<<endl;
    	cout<<"l'id avec toString()est: "<<i.toString(l,a)<<endl<<endl;
    	cout<<"quelle est la categorie de la piece:  ";
    	cin>>category;
    	cout<<"decrivez la piece: ";
    	cin>>description;
     
    	cout<<"Donnez une estimation en euro de la piece:";
    	cin>>valeur;
    	cout<<"quelle est sa date d'entree au musee: ";
    	cin>>dateIn;
    	setDateIn(dateIn);
          	cout<<"la piece est-elle exposee au musee O/N: "<<endl;
    	cin>>exposed;
    	cout<<"encodage de l'auteur"<<endl;
     
    	pmar.auteur->Encoder();
     
    	this->auteur->nom = pmar.auteur->nom;
    	this->auteur->prenom = pmar.auteur->prenom;
    	this->auteur->dateDeNaissance = pmar.auteur->dateDeNaissance;
     
     
    	return *this;	
    }
    j'ajoute les element dans le vecteur template avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template <class type>
    int TVecteur<type>::ajout( type *n)
    {
    	type *pNouv = new type;
            *pNouv = *n;// l'operateur = est surchargé correctement 
    	data[nbrElem] = *pNouv;	
    	nbrElem++;
     
    	return 1;	
    }
    et j'affiche avec la methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template <class type>
    void TVecteur<type> :: affContenu(void)
    {
    	iterTVecteur<type> it(*this);
    	while(!it.end())
    	{
    		type t((type &)it);
    		cout<<t<<endl;//surchargé dans la classe type instanciée
    		it++;
     
    	}
    pourquoi à votre avis il m'affiche les parametre par defaut?

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Ton code n'est pas const-correct. *this retourne un objet constant, et le constructeur de ton itérateur indique qu'il va modifier son paramètre.

    PS : Inclure le message d'erreur aurait aidé à voir le problème...

  3. #3
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    desolé j'ai oublié de poster le message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    main.cxx:28:   instantiated from here
    TVecteur.h:39: erreur: ‘it’ has incomplete type
    TVecteur.h:39: erreur: storage size of ‘it’ isn't known
    Sorry

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Ok, c'est probablement un problème dans des #include et tes forward declarations de classes (en plus du problème de const déjà cité). Il va falloir nous en montrer plus sur ce sujet (les différents fichiers, ce qu'il y a au début...) pour qu'on soit spécifiques.

  5. #5
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    Merci JolyLoic pour ton aide
    voici plus ou moins l'integralité de mon code
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #ifndef TVECTEUR_H
    #define TVECTEUR_H
     
    //#include "PieceMuseeArt.h"
     
    #include <stream.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <values.h>
     
    template <class type>class iterTVecteur;
     
    template <class type> class TVecteur
    {
    	private:
    		type *data;
    		int nbrElem;
    	public:
    		TVecteur(int n=10 ){data = new type[n];
    	nbrElem = n;}
     
        	        void affContenu (void);
    		/*{
    			cout << "Nombre d'elements = " << nbrElem << endl<<endl;
     
    		}*/
         		int ajout (type *n);
         		int retrait (void);
     
    		~TVecteur(void){delete data;}
    };
     
     
    template <class type>
    void TVecteur<type> :: affContenu(void)
    {
    	iterTVecteur<type> it(*this);
    	while(!it.end())
    	{
    		//PieceMuseeArt *p = new PieceMuseeArt;
    		type t((type)it);
    		cout<<t<<endl;
    		it++;
    	}
     
     
     
    }
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #ifndef ITERTVECTEUR_H
    #define ITERTVECTEUR_H
     
    #include "TVecteur.h"
    #include <stream.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <values.h>
     
    template <class type>
    class iterTVecteur 
    {
            private :
    		TVecteur<type>& p;
    		type *pCur;
     
    	public :
    //le parametre est egalement un objet template
     
                    iterTVecteur (TVecteur<type>& s) : p(s)
                            { pCur = s.data; }
     
    		int end() 
                    {
                            return pCur==0;
                    }
     
    		void reset () { pCur = p.data; }
     
                    int operator++ ()
                    {
                            if (!end())
                            {
                                    pCur++;
                                    return 1;
                            }
                            else return 0;
                    }
                    int operator++ (int) { return operator++(); }
     
                    operator type ()const
    		{
     
    		  return *pCur;
     
    		  }
                    void operator= (type *v)
    		{ pCur = v;}
     
     
     
    };
     
     
    #endif
    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
     
    #include "TVecteur.h"
     
     
     
     
    int main()
    {
    	int i;
    	cout<<"combien delement voulez vous"<<endl;
    	cin>>i;
    	PieceMuseeArt p;
    	TVecteur<PieceMuseeArt>vpm(i);
    	cout<<"fini";
    	vpm.ajout(&p);
    	vpm.affContenu();
     
     
    }
    à l'aide...

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    J'ai pas le temps de regarder en detail, mais qu'est-ce que vient faire #include "PieceMuseeArt.h" (qui est visiblement quelque chose de specifique a l'application) dans un entete d'une classe "technique" comme un vecteur?

  7. #7
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    l'include de PieceMuseeArt est present car à un certain moment je voulais instancier cette classe (plus loin).
    je vais essayer de l'enlever et te dire ce que ça donne.
    a tout de suite.

  8. #8
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    rien de nouveau jean marc toujours le meme probleme

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Je ne comprends pas, j'ai copié ton code et je l'ai compilé (sous visual 2005) et ça fonctionne. Je me mange juste une seg fault sur la dernière itération de la boucle for de affContenu, je n'ai pas regardé puisque ce n'est pas le sujet.

    A mon avis, tu dois avoir oublié un ';' quelque part ou une bêtise dans le genre.

    En fait, l'erreur "has incomplete type", si j'ai bien compris, viens du fait que tu fais appel à une fonctionnalité de la classe qui n'est pas implémentée. Mais je ne comprends pas pourquoi il ne donne pas plus de détails dans le message d'erreur.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Dans ton main, le fichier iterVecteur.h n'est jamais inclus. Tu inclues uniquement Vecteur.h
    et Vecteur.h n'inclue pas iterVecteur.h

    A priori ton compilo ne valide pas les définitions de templates, mais uniquement leur instanciation.
    A l'instanciation du template dans ton main.c le type TVecteur est connu, mais celui-ci fait appel au type iterVect qui lui est inconnu.
    (en fait pas tout à fait inconnu puisqu'il y a une déclaration par avance dans TVecteur.h, d'où le type incomplet).

  11. #11
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    Jan Rendek Bien vu j'ai bien oublié l'include

    ça a resoulu partiellement mon erreur car je vois apparaitre de nouvelle erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TVecteur.h: In member function ‘void TVecteur<type>::affContenu() [with type = PieceMuseeArt]’:
    main.cxx:30:   instantiated from here
    TVecteur.h:44: erreur: no matching function for call to ‘PieceMuseeArt::PieceMuseeArt(iterTVecteur<PieceMuseeArt>&)’
    PieceMuseeArt.h:34: note: candidats sont: PieceMuseeArt::PieceMuseeArt(PieceMuseeArt&)
    PieceMuseeArt.h:25: note:                 PieceMuseeArt::PieceMuseeArt(Identifiant, char*, char*, int, char*, char, char, char*, Personne*, char*)
    PieceMuseeArt.h:17: note:                 PieceMuseeArt::PieceMuseeArt()
    ça me rend fou ces template ,pk il arrive pas a instancier mon itérateur en tant que pieceMusee?

  12. #12
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    c bon g trouvé l'erreur

    Merci pour l'aide

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'ai l'impression que tu n'as pas corrigé les problèmes de const que j'ai signalés dans mon premier post...

    En outre, quand tu écris :
    Tu essaye de caster ton itérateur en objet, ce qui à la base semble pas très propre. Mais passons.

    Ce cast va te créer un objet temporaire, que tu passes ensuite en paramètre à ton constructeur par copie. Ceci demande l'existance d'un constructeur de copie prenant en paramètre une référence constante vers un objet. Or, tu as visiblement défini le constructeur par copie suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PieceMuseeArt::PieceMuseeArt(PieceMuseeArt&)
    Qui prend son paramètre par référence non constante, et empêche la génération automatique du constructeur par copie classique.


    Il va vraiment falloir que tu fasses plus attention à tes const...

    Quant au message d'erreur que tu as mis, est-tu certain qu'il correspond à la version du code montré ? Tel qu'est le code, j'aurais plutôt vu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TVecteur.h:44: erreur: no matching function for call to ‘PieceMuseeArt::PieceMuseeArt(PieceMuseeArt const &)’
    Ou alors le message que tu as indiqué pour le code :

  14. #14
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    Merci JolyLoic c'est exactement ça

    je te remercie pour ton aide.

    à bientot

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

Discussions similaires

  1. Erreur d'affichage dans un displaysField
    Par abraxis dans le forum Ext JS / Sencha
    Réponses: 7
    Dernier message: 24/01/2012, 11h33
  2. Erreur d'affichage dans un StringGrid
    Par yannba dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/09/2011, 22h58
  3. Erreur d'affichage dans les boite de dialogue windows
    Par DEVELSI dans le forum Windows
    Réponses: 3
    Dernier message: 26/06/2007, 08h31
  4. [debutant]Erreur d'affichage dans le navigateur
    Par romca dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/06/2006, 10h21
  5. [MySQL] Erreur d'affichage d'un listing php dans un html
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 10/04/2006, 22h13

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