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 :

Impossible d'appeler le constructeur template


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 42
    Points : 18
    Points
    18
    Par défaut Impossible d'appeler le constructeur template
    Bonjour, j'avais déjà créé un post sur la virtualisation de méthodes template ici.

    Et maintenant que j'ai les infos qu'il me faut j'ai donc poursuivi la chose (donc ceci est la suite en quelque sorte de mon ancien post)

    J'ai donc créer une classe Variable:

    Variable.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
     
    #ifndef DEF_VARIABLE
    #define DEF_VARIABLE
     
    #include "../All.cpp"
     
    class Variable
    {
        // Constructeur
    public:
        Variable();
        Variable(int);
        Variable(Variable const& v);
     
        template<typename T>
        Variable(T n);
     
        // Attributs
    public:
     
    private:
        typeVar type;
        boost::any val;
     
    protected:
     
        // Méthodes
    public:
        virtual void incremente();
        virtual void decremente();
     
        virtual std::string toString();
        virtual std::string typeNameToString();
     
        virtual unsigned int getMemorySize();
     
     
    };
     
    #endif
    Variable.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
     
     
    #include "../All.cpp"
    #include "Variable.h"
     
     
    using namespace std;
     
     
    Variable::Variable(){
    }// TEMP : TODO
    Variable::Variable(int i){
    }// TEMP : TODO
     
    Variable::Variable(Variable const& v) {
    }// TEMP : TODO
     
    template<typename T>
    Variable::Variable(T n){
        val=n;
        if(typeid(n)==typeid(int)){
            cout << "int!" << endl;
            type=i_int;
        } else if(typeid(n)==typeid(unsigned int) || typeid(n)==typeid(uint)){
            cout << "uint!" << endl;
            type=i_uint;
        } else if(typeid(n)==typeid(char)){
            cout << "char!" << endl;
            type=i_char;
        } else if(typeid(n)==typeid(unsigned char) || typeid(n)==typeid(uchar)){
            cout << "unsigned char!" << endl;
            type=i_uchar;
        } else {
            cout << "? ? ?" << endl;
            type=i_notype;
        }
    }
     
    void Variable::incremente(){}// TEMP : TODO
    void Variable::decremente(){}// TEMP : TODO
     
    string Variable::toString(){
        return "NoValue"; // TEMP : TODO
    }
     
    string Variable::typeNameToString(){
        return "NoValue"; // TEMP : TODO
    }
     
    unsigned int Variable::getMemorySize(){
        return sizeof(*this); // TEMP : TODO
    }
    Et voici main.cpp qui test cette classe:

    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 "All.cpp"
     
    using namespace std;
     
    int main()
    {
     
        new Variable();
        new Variable((int)5);
        new Variable((char)5); // plante
     
    #ifdef DEBUG_TIMERS
            cout << endl <<"Temps d'execution (ms): "<< clock() << endl;
    #endif
        return returnCode;
    }
    Et voila le message du compilo (gcc) :

    undefined reference to `Variable::Variable<char>(char)'


    Pourtant le constructeur existe et il est accessible puisque les 2 lignes au dessus de celle qui plante fonctionnent.

    D'où vient le problème svp?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Une méthode template doit être déclarée et définie dans le même header :
    http://cpp.developpez.com/faq/cpp/?p...VERS_templates

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Une méthode template doit être déclarée et définie dans le même header :
    http://cpp.developpez.com/faq/cpp/?p...VERS_templates
    'Tain ! C'est déjà la deuxième fois qu'on me le dis... Je suis vraiment un !

    Merci beaucoup

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

Discussions similaires

  1. Impossible d'appeler un autre constructeur
    Par Topeur dans le forum C++
    Réponses: 3
    Dernier message: 27/05/2008, 18h44
  2. Template - Appelé le constructeur de copy
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 06/02/2008, 22h42
  3. Appel recursif avec template
    Par Math75 dans le forum Langage
    Réponses: 24
    Dernier message: 13/10/2005, 11h57
  4. appel d un template mais sans etre ds le bon node
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/09/2005, 15h46
  5. [héritage privé] appel du constructeur de base
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 4
    Dernier message: 19/10/2004, 14h05

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