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 :

Spécialisation template et définition multiple


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Points : 42
    Points
    42
    Par défaut [Résolu] Spécialisation template et définition multiple
    Bonjour a tous,

    j'ai encore une fois un probleme:

    J'ai crée une class node et je souhaite spécialisé une méthode
    En fait un noeud contient une liste de noeud fils et un attribut pour la donnée. Je veux que la classe fonctionne avec n'importe quel type de donné donc j'utilise un template.

    Cependant quand je compile j'ai une erreur comme quoi j'ai une multiple définition sur ma fonction getNode où j'y définis le corps.

    Sur cette ligne en fait:
    Node<int> * Node<int>::getNode(CString name){

    quelqu'un a une idée ?

    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
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
     
    #ifndef __NODE_H
    #define __NODE_H
     
    #include <list>
     
    #include "ClovisVariable.h"
    #include "CString.h"
     
    namespace clovis {
     
    	namespace core {
            /*!
                     * \brief A node class using force tree and graph
                     * The class define a generic class node
                     */
            template<class T>
            class Node{
     
                public:
     
                    /*!
                     * Constructor
                     */
                    Node( T * value = NULL);
                    Node ( T value = NULL);
     
                    /*!
                     * Destructor
                     */
                    ~Node();
     
                    /*!
                     * addNode
                     */
                    Node<T> * addNode( T * value );
                    Node<T> * addNode( T value );
     
                    /*!
                     * isEmpty
                     * return true if current node as no value
                     */
                    bool isEmpty();
     
                    /*!
                     * getSize()
                     * return The number of node's son
                     */
                    int getSize();
     
                    /*!
                     * get()
                     * \return Node value
                     */
                    T * get();
     
                    /*!
                     * set
                     * Set Value
                     */
                    void set(T * value);
                    void set(T value);
     
                    /*!
                     * getNext
                     * return the next son
                     */
                    Node<T> * getNext();
     
                    /*!
                     * resetPosition
                     */
                    void resetPosition();
     
                    /*!
                     * deleteSon
                     */
                    bool deleteSon(CString name);
     
                    /*!
                     * goTo
                     * Return the node after the parcours
                     * \return The asked node , NULL else
                     */
                    Node<T> * getNode( CString name );
     
     
                private:
     
                    //! Node value
                    T * value;
                    //! Node's list neighbour
                    std::list<Node*> nodes;
                    //! Son's iterator
                    typename std::list< Node* >::iterator iter;
                    int currentPosition;
     
            };
     
    //////////////////////////////////////////////////////////
    // Constructeur                                         //
    //////////////////////////////////////////////////////////
            template <class T>
            Node<T>::Node( T * value ){
                this->value = value;
                resetPosition();
            }
     
            template <class T>
            Node<T>::Node( T value ){
                this->value = new T(value);
            }
     
    ///////////////////////////////////////////////////////////
    // Destructeur                                           //
    ///////////////////////////////////////////////////////////
            template <class T>
            Node<T>::~Node(){
     
            }
     
    ///////////////////////////////////////////////////////////
    // Fonction Publique                                     //
    ///////////////////////////////////////////////////////////
            template <class T>
            Node<T> * Node<T>::addNode( T * value ){
                nodes.push_back( Node(value) );
                resetPosition();
                return nodes.back();
            }
     
            template <class T>
            Node<T> * Node<T>::addNode( T value ){
                T * tmp = new T(value);
                nodes.push_back( new Node(tmp) );
                resetPosition();
                return nodes.back();
            }
     
            template <class T>
            bool Node<T>::isEmpty(){
                if (this->value == NULL)
                    return true;
                else
                    return false;
            }
     
            template <class T>
            int Node<T>::getSize(){
                return ( nodes.size() );
            }
     
            template <class T>
            T * Node<T>::get(){
                return this->value;
            }
     
            template <class T>
            void Node<T>::set(T * value){
                delete this->value;
                this->value = value;
            }
     
            template <class T>
            void Node<T>::set(T value){
                delete this->value;
                this->value = new T(value);
            }
     
            template <class T>
            Node<T> * Node<T>::getNext(){
                Node<T> * t = NULL;
                t = *iter;
                if ( currentPosition <= getSize() ){
                    iter++;
                    currentPosition++;
                }else{
                    return NULL;
                }
                return t;
            }
     
            template <class T>
            Node<T> * Node<T>::getNode(CString name){
                return NULL;
            }
     
            template <>
            Node<int> * Node<int>::getNode(CString name){
                    return NULL;
            }
     
    ///////////////////////////////////////////////////////////
    // Fonction Private                                     //
    ///////////////////////////////////////////////////////////
            template <class T>
            void Node<T>::resetPosition(){
                iter = nodes.begin();
                currentPosition = 1;
            }
     
     
    	};
    };
     
     
    #endif

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Je ne vois pas la version template de getNode(), et il me semble qu'elle est censée être avant la version spécialisée.

    PS: Je ne suis pas sûr qu'il soit très approprié d'accepter à la fois T et T* dans tes fonctions...

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    J'ai modifié mon code , j'ai ajouté le corps de la fonction getNode() au dessus de la spécialisation , mais ça ne retire pas mon erreur.

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Je trouve que ça ressemble plus à une spécialisation de classe que de fonction (mais c'est juste un avis personnel), la solution serait de spécialiser entièrement la classe (en la réécrivant).

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Merci pour votre réponse je vais tester ça !

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    A moins que je me trompe , si je spécialise la classe je devrais me retapper ttes les fonctions , hors seul une seul fonction sera différente ... que faire spécialiser la classe ou la fonction ?

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    as-tu essayé d'enlever:

    devant ta fonction spécialisée

    Autre chose: Si une fonction spécialisée n'est pas inline (là elle l'est), il faut la mettre dans le cpp (je dis juste ça au cas où le problème t'arrive un jour )

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    non quand je le retire j'ai la meme erreur il dit qu'il est déja définis ... sur la meme ligne ... c'est un poil embetant

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Toutes mes excuses!

    Je n'avais pas vu que la fonction n'était pas inlinée.

    Donc, il faut:

    1) enlever le template <> devant la fonction spécialisée
    2) Soit l'inliner (mettre le mot clé inline devant la définition), soit la mettre dans le cpp

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Oula c'est pas vrai que ça marche !!!

    Est ce que tu as une info ou deux pour m'expliquer ton raisonnement pour corriger le problème... histoire que je comprenne mon erreur !

  11. #11
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Apparemment, quand tu spécialises une fonction, ce n'est plus une fonction 'template', c'est une fonction normale (car tu précises tout), et donc soit on l'inline, soit on la met dans le cpp.

Discussions similaires

  1. Template, spécialisations et définitions multiples.
    Par 3DArchi dans le forum Langage
    Réponses: 3
    Dernier message: 26/09/2008, 18h45
  2. Réponses: 19
    Dernier message: 18/03/2007, 17h57
  3. définition multiple
    Par elekis dans le forum C++
    Réponses: 3
    Dernier message: 01/03/2006, 17h32
  4. [g++] Définitions multiples
    Par GLDavid dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/12/2005, 17h04
  5. Réponses: 22
    Dernier message: 05/07/2005, 01h04

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