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 :

Problème avec les templates


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 73
    Points
    73
    Par défaut Problème avec les templates
    Salut,
    Voila, cela fait un bon moment que je code en c++ (plus d'un an), mais, je dois dire que, je suis l'un des fanatiques du c :p, du moment que je combine efficacité du c avec poo du c++, mais, bon...
    Voila mon problème, à un moment donnée, j'ai eu marre des void*, et j'ai décidé de passer aux templates, je suis en train de réécrire ma lib pour gérer listes, piles, files, cartes, en utilisant (en essayant) les templates, voila ce que ça donne en code:

    le .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
    #define EXPORT __declspec(dllexport)
    #ifdef DEBUG
    #define _debug 1
    #else
    #define _debug 0
    #endif
     
    #ifndef DEF_FIS_CONT_H
    #define DEF_FIS_CONT_H
     
    #include<iostream>
    #include<string>
     
    template< class T >
    class EXPORT fis_list
    {
    public:
     
    	fis_list();
    	~fis_list();
     
    	int add_at_head(T* data);
    	int add_at_end(T* data);
    	int add_after(T* data, T* data_after);
    	int add_before(T* data, T*data_before);
    	int add_ordered(T* data);//Insertion triée.
    	T* is_present(T* data);
    	bool delete_data(T* data);
    	bool delete_all(T* data);
     
    private:
     
    	struct list
    	{
    		T* data;
    		list* next;
    		list* prev;
    	};
     
    	list* _head;
    	list* _tail;
    	long  _count;
    };
     
    #endif
    le .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
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    #include"FIS_LIST.h"
     
    template< class T >
    fis_list<T>::fis_list()
    {
    	_head = NULL;
    	_tail = NULL;
    }
     
    template< class T >
    fis_list<T>::~fis_list()
    {
    }
     
    template< class T >
    int fis_list<T>::add_at_head(T *data)
    {
    	list* ele = new list;
    	if(ele == NULL)
    	{
    		if(_debug)
    			cout<<"Could not create the new element."<<endl;
    		return 0;//échec.
    	}
     
    	ele->next = _head;
    	if(_head != NULL)
    	{
    		_head->prev = ele;
    		_tail = ele;
    	}
    	ele->next = _head;
    	ele->prev = NULL;
    	ele->data = data;
    	_head = ele;
     
    	return 1;
    }
     
    template< class T >
    int fis_list<T>::add_at_end(T *data)
    {
    	list* ele = new list;
    	if(ele == NULL)
    	{
    		if(_debug)
    			cout<<"Could not create the new element."<<endl;
    		return 0;//échec.
    	}
     
    	if(_head == NULL)
    	{
    		return add_at_head(data);
    	}
     
    	_tail->next = ele;
    	ele->next = NULL;
    	ele->prev = _tail;
    	ele->data = data;
    	_tail = ele;
     
    	return 1;
    }
     
    template< class T >
    int fis_list<T>::add_before(T *data, T *data_before)
    {
    	list* ptr = _head;
    	while(ptr != NULL)
    	{
    		if(ptr->data == data_before)
    		{
    			list* ele = new list;
    			if(ele == NULL)
    			{
    				if(_debug)
    					cout<<"Could not create the new element."<<endl;
    				return 0;//échec.
    			}
    			if(ptr->prev == NULL)
    			{
    				ele->prev = NULL;
    				_head = ele;
    			}			
    			else
    			{
    				ele->prev = ptr->prev;
    				ptr->prev->next = ele;
    			}
    			ptr->prev = ele;
    			ele->next = ptr;
    			ptr->data = data;
     
    			return 1;
    		}
    		ptr = ptr->next;
    	}
     
    	return 0;
    }
     
    template< class T >
    int fis_list<T>::add_after(T *data, T *data_after)
    {
    	list* ptr = _head;
    	while(ptr != NULL)
    	{
    		if(ptr->data == data_after)
    		{
    			list* ele = new list;
    			if(ele == NULL)
    			{
    				if(_debug)
    					cout<<"Could not create the new element."<<endl;
    				return 0;//échec.
    			}
    			if(ptr->next == NULL)
    			{
    				ele->next = NULL;
    				_tail = ele;
    			}			
    			else
    			{
    				ele->next = ptr->next;
    				ptr->next->prev = ele;
    			}
    			ptr->next = ele;
    			ele->prev = ptr;
    			ptr->data = data;
     
    			return 1;
    		}
    		ptr = ptr->next;
    	}
     
    	return 0;
    }
    Et bien évidement, ce que me sort le compilateur de VC++ 2005 pro:
    main.obj : error LNK2019: unresolved external symbol "public: __thiscall fis_list<int>::~fis_list<int>(void)" (??1?$fis_list@H@@QAE@XZ) referenced in function _main
    main.obj : error LNK2019: unresolved external symbol "public: __thiscall fis_list<int>::fis_list<int>(void)" (??0?$fis_list@H@@QAE@XZ) referenced in function _main
    H:\Projets\BLACK_SCORPION_GHOST\3D_Engine\tools\container_lib\FIS_CONTAINER\Debug\FIS_CONTAINER.exe : fatal error LNK1120: 2 unresolved externals
    Someone to help me please
    Voila, merci.

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca ressemble à ca
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    Merci pour ton aide 'si précise', mais, j'ai la faq c++ juste sur l'onglet d'à côté :s
    J'ai fouillé mes livres, les articles sur le net... aucun texte n'a pu m'aider, c'est pour cela que je me tourne vers vous, alors s'il vous plait, essayez de donner des réponses un peu plus précises.
    Merci encore une fois

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    David t'a donné le lien qui donne la solution à ton problème.

    On ne doit pas mettre l'implémentation des fonctions dans un fichier .cpp, à moins de l'inclure à la fin du fichier d'en-tête.

    Mais en premier lieu, donner directement la définition des fonctions en même temps que de les déclarer résoudra ton soucis. Ensuite, tu pourras utiliser l'astuce présentée dans la FAQ

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    Voila, ça marche très bien
    Merci à vous, et je tiens à remercier David et de m'excuser en plus, car, 'j'ai cru qu'il se foutait de moi', donc, 1000 et un fois je m'excuse David.
    Merci encore.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    On dirait pas, mais on a bien rempli la FAQ au fil de ces dernières années ^^

    Accessoirement, si c'est pour un exo personnel, très très bien, mais sinon, pour du vrai code, je ne peux que te conseiller d'utiliser la bibliothèque standard du langage qui contient déjà ce genre de classes, en particulier std::list dans ce cas précis.
    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 régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    Comme tu l'as bien deviné, c'est une sorte d'exercice, car, pour le projet de licence, je prépare un moteur graphique basé sur openGl, et, je souhaite (mis à part l'affichage et les événements) écrire tous le moteur en me basant sur mes connaissances, et en utilisant le moins de lib possible (sauf celles qui sont vraiment indispensables)
    Voila.

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Perso, un projet de licence j'appelle ca de la production. De plus je pense que tu as déjà suffisamment de boulot avec le coté technique de la 3D et des algos qui s'y rapportent pour éviter de te prendre le choux avec des listes chaînées et les autres trucs que tu souhaite réinventer.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. problème avec les template c++
    Par lenas_tshaleb dans le forum C++
    Réponses: 4
    Dernier message: 17/03/2015, 17h58
  2. Problème avec les templates (patrons)
    Par bounadalvidal dans le forum Débuter
    Réponses: 3
    Dernier message: 09/04/2011, 07h14
  3. Problème avec les templates.
    Par mondaying dans le forum C++
    Réponses: 5
    Dernier message: 08/03/2011, 19h03
  4. [Xtext] Problème avec les templates pour les mots clé
    Par P1t0u dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 10/06/2010, 15h53
  5. Problème avec les templates de class
    Par _SamSoft_ dans le forum C++
    Réponses: 8
    Dernier message: 21/08/2008, 10h30

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