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 :

Template + probleme à l'édition des liens


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut Template + probleme à l'édition des liens
    Bonjour,

    je suis confronté à un problème assez ennuyant. Cela fait maintenant + de 4h que je cherche d'où vient ce problème, mais rien !

    Voici mon code :

    CVecteurTemplate.h :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    #ifndef __CVECTEUR_H__
    #define __CVECTEUR_H__
     
    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    template <class XTYPE>
    struct noeud
    {
    	XTYPE valeur;
    	noeud<XTYPE> *pSuiv;
    	noeud(XTYPE n, noeud<XTYPE> *s):valeur(n),pSuiv(s) {};
    };
     
     
    template <class XTYPE> class CVecteurIter;
     
    template <class XTYPE> 
    class CVecteur
    {
    	private:
    		noeud<XTYPE> *v_pVec;
     
    	public:
    		CVecteur():v_pVec(0) {};
    		~CVecteur(void);
     
    		char empty(void) { return v_pVec ? 0:1; }
    		XTYPE head(void) { return v_pVec->valeur; }
    		void insert(XTYPE n);
    		void display(void);
    		void removeAll(void);
     
    		friend class CVecteurIter<XTYPE>;
     
    };
     
    template<class XTYPE>
    class CVecteurIter
    {
    	private:
    		CVecteur<XTYPE>& v_vec;
    		noeud<XTYPE> *v_pCur;
     
    	public:
    		CVecteurIter(CVecteur<XTYPE>& v):v_vec(v),v_pCur(v.v_pVec) {};
    		int end() { return v_pCur == 0; }
    		void reset () { v_pCur = v_vec.v_pVec; }
     
    		char operator ++ ()
    		{
    			if(v_pCur)
    			{
    				v_pCur = v_pCur->pSuiv;
    				return 1;
    			}
    			else 
    				return 0;
    		}
     
    		char operator ++ (int) { return operator ++ (); }
    		operator XTYPE() const { return v_pCur->valeur; }
    		XTYPE& operator& (void) { return v_pCur->valeur; }
     
    };
     
     
    #endif

    CVecteurTemplate.cpp :

    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
     
     
    #include "CVecteurTemplate.h"
     
    template <class XTYPE>
    CVecteur<XTYPE>::~CVecteur()
    {
    	noeud<XTYPE> *pCur, *pPrec;
    	pCur = v_pVec;
    	while(pCur != NULL)
    	{
    		pPrec = pCur;
    		pCur = pCur->pSuiv;
    		delete pPrec;
    	}
    }
     
    template <class XTYPE>
    void CVecteur<XTYPE>::insert(XTYPE n)
    {
    	v_pVec = new noeud<XTYPE> (n,v_pVec);
    }
     
    template <class XTYPE>
    void CVecteur<XTYPE>::display()
    {
    	CVecteurIter<XTYPE> it(*this);
     
    	cout<<"(";
    	while(!it.end())
    	{
    		XTYPE t( (XTYPE)it );
    		cout<<t<<", ";
    		it++;
    	}
     
    	cout<<"\x8\x8)"<<endl;
    }
     
    template <class XTYPE>
    void CVecteur<XTYPE>::removeAll()
    {
    	noeud<XTYPE> *pCur, *pPrec;
    	pCur = m_pVec;
     
    	while(pCur != NULL)
    	{
    		pPrec = pCur;
    		pCur = pCur->pSuiv;
    		delete pPrec
    	}
     
    	v_pVec = pCur;
    }

    et dans mon main.cpp, j'instancie cette classe CVecteur.

    main.cpp :

    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
    #include <iostream.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
     
    #include "CVecteurTemplate.h"
     
    void main()
    {
     
    	// Création de la liste d'entiers
    	/////////////////////////////////
     
    	CVecteur<int> listint;
     
    	listint.insert(1);
     
    	getchar();	
     
    	listint.display();
     
    	getchar();
     
    }
    Dans un premier temps, j'aimerais utiliser des INT à l'intérieur de ce vecteur. Mais voici les erreurs qu'il me sort lorsque j'instancie ma classe et que j'utilise les méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Linking...
    main.obj : error LNK2001: unresolved external symbol "public: __thiscall CVecteur<int>::~CVecteur<int>(void)" (??1?$CVecteur@H@@QAE@XZ)
    main.obj : error LNK2001: unresolved external symbol "public: void __thiscall CVecteur<int>::display(void)" (?display@?$CVecteur@H@@QAEXXZ)
    main.obj : error LNK2001: unresolved external symbol "public: void __thiscall CVecteur<int>::insert(int)" (?insert@?$CVecteur@H@@QAEXH@Z)
    Si quelqu'un pouvait m'éclairer, ce serait vraiment sympa. Je bloque la dessus, et je ne comprends pas pourquoi.

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par ExSter
    Bonjour,

    je suis confronté à un problème assez ennuyant. Cela fait maintenant + de 4h que je cherche d'où vient ce problème, mais rien !
    Fallait commencer par la FAQ : http://c.developpez.com/faq/cpp/?pag...VERS_templates

  3. #3
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    Citation Envoyé par roulious
    T'inquiètes pas, si j'ai encore le problème et si j'ai posté, c'est que j'ai lu et essayé ce qui était mis dans la FAQ

  4. #4
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    Je précise que je suis sous Visual C++ 6.0 et que le code sera, une fois fini, transposé pour être utilisé sous UNIX.

  5. #5
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    Bon, j'avais essayé en déclarant (en partie) mon template dans le .H dont le .CPP en faisait une include !

    Mais bon la, j'ai carrément TOUT COPIÉ du .CPP dans le .H !!!

    Et la, je n'ai plus ce problème !!!

    Mais je ne comprends pas pourquoi !!!

    Dans mon manuel de référence, son auteur crée des TEMPLATES en utilisant des fichiers .H et .CPP.
    Le .CPP fait un include du .H et c'est bon, ça fonctionne.

    Pourquoi ça ne fonctionne pas chez moi comme cela ? c'est très ennuyant ...

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par ExSter
    Bon, j'avais essayé en déclarant (en partie) mon template dans le .H dont le .CPP en faisait une include !

    Mais bon la, j'ai carrément TOUT COPIÉ du .CPP dans le .H !!!
    Tu es sûr que tu avais lu la FAQ avant ?

    Dans mon manuel de référence, son auteur crée des TEMPLATES en utilisant des fichiers .H et .CPP.
    Le .CPP fait un include du .H et c'est bon, ça fonctionne.
    Donnes nous son nom afin qu'on le blackliste et le déconseille à l'avenir. Il y a beaucoup demauvais bouquins. Cette erreur est relativement mineure, mais tout de même.

    Pourquoi ça ne fonctionne pas chez moi comme cela ? c'est très ennuyant ...
    Probablement parce que VC cherche à compiler les .cpp qui sont connus du projet, alors que sous *nix on spécifie à la main, dans le makefile, ce qui doit être compilé ?


    Au fait. Vu ce que tu devras faire plus tard (i.e., le portage), j'ai bien l'impression qu'il s'agisse de code industriel. Pourquoi diable ai-je cette impression que vous réinventez la roue ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    Voici mon nouveau CVecteurTemplate.h :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    #ifndef __CVECTEUR_H__
    #define __CVECTEUR_H__
     
    #include <iostream.h>
    //#include <sstream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    template <class XTYPE>
    struct noeud
    {
    	XTYPE valeur;
    	noeud<XTYPE> *pSuiv;
    	noeud(XTYPE n, noeud<XTYPE> *s):valeur(n),pSuiv(s) {};
    };
     
     
    template <class XTYPE> class CVecteurIter;
     
    template <class XTYPE> 
    class CVecteur
    {
    	private:
    		noeud<XTYPE> *v_pVec;
     
    	public:
    		CVecteur():v_pVec(0) {};
    		~CVecteur(void)
    		{
     
    			noeud<XTYPE> *pCur, *pPrec;
    			pCur = v_pVec;
    			while(pCur != NULL)
    			{
    				pPrec = pCur;
    				pCur = pCur->pSuiv;
    				delete pPrec;
    			}
    		};
     
    		char empty(void) { return v_pVec ? 0:1; }
    		XTYPE head(void) { return v_pVec->valeur; }
    		void insert(XTYPE n)
    		{
    			v_pVec = new noeud<XTYPE> (n,v_pVec);
    		};
     
    		void display(void)
    		{			
    			CVecteurIter<XTYPE> it(*this);
     
    			cout<<"(";
    			while(!it.end())
    			{
    				XTYPE t( (XTYPE)it );
    				cout<<t<<", ";
    				it++;
    			}
     
    			cout<<"\x8\x8)"<<endl;
    		};
     
    		void removeAll(void);
     
    		friend class CVecteurIter<XTYPE>;
     
    };
     
    template<class XTYPE>
    class CVecteurIter
    {
    	private:
    		CVecteur<XTYPE>& v_vec;
    		noeud<XTYPE> *v_pCur;
     
    	public:
    		CVecteurIter(CVecteur<XTYPE>& v):v_vec(v),v_pCur(v.v_pVec) {};
    		int end() { return v_pCur == 0; }
    		void reset () { v_pCur = v_vec.v_pVec; }
     
    		char operator ++ ()
    		{
    			if(v_pCur)
    			{
    				v_pCur = v_pCur->pSuiv;
    				return 1;
    			}
    			else 
    				return 0;
    		}
     
    		char operator ++ (int) { return operator ++ (); }
    		operator XTYPE() const { return v_pCur->valeur; }
    		XTYPE& operator& (void) { return v_pCur->valeur; }
     
    };
     
     
    #endif

  8. #8
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    Je suppose que c'est VISUAL C++ 6.0 qui provoque cette erreur car sous UNIX cela fonctionne apparemment.

    C'est pour cela que j'insistais ...

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

Discussions similaires

  1. [Templates] Erreur à l'édition des liens
    Par Bleys dans le forum C++
    Réponses: 5
    Dernier message: 20/01/2010, 11h03
  2. Probleme d'édition des liens
    Par vjbda dans le forum Visual C++
    Réponses: 7
    Dernier message: 02/04/2008, 23h10
  3. Réponses: 2
    Dernier message: 11/08/2007, 11h29
  4. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50

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