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 qui n'est jamais appelée


Sujet :

Langage C++

  1. #1
    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 Spécialisation template qui n'est jamais appelée
    Bonjour,

    tout d'abord j'ai une fonction ConvertTo qui permet de convertir un type en un autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <class A, class B>
    A ConvertTo(const B &item)
    {
        stringstream str;
        str << item;
        A ret;
        str >> ret;
        return ret;
    }
    A l'appel, on fait donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ....
    int a = 10;
    string b = ConvertTo<string>(a);
    cout << b << endl;
    Jusque là, pas de problèmes.

    J'ai même réussi à spécialiser la fonction pour passer d'une string à un int:

    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
    #include <iostream>
    #include <string>
    #include <sstream>
     
    using namespace std;
     
    template <class A, class B>
    A ConvertTo(const B &item)
    {
        stringstream str;
        str << item;
        A ret;
        str >> ret;
        return ret;
    }
     
    /** marche très bien **/
    template <>
    inline int ConvertTo(const std::string &item)
    {
        return atoi(item.c_str());
    }
    Et là, à l'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main()
    {
         string a = "130";
         int i = ConvertTo<int>(a);
         cout << i << endl;
     
         return 0;
    }
    C'est bien la fonction spécialisée qui est appelée.

    Seulement je n'arrive pas à faire la même chose avec A = int et B = const char*.

    Voici le code complet:

    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
    #include <iostream>
    #include <string>
    #include <sstream>
     
    using namespace std;
     
    template <class A, class B>
    A ConvertTo(const B &item)
    {
        cout << "Fonction générique appelée" << endl;
        stringstream str;
        str << item;
        A ret;
        str >> ret;
        return ret;
    }
     
    /** marche très bien **/
    template <>
    inline int ConvertTo(const std::string &item)
    {
        cout << "Fonction spécialisée appelée" << endl;
        return atoi(item.c_str());
    }
     
    /** ne compile pas **/
    //template <>
    //inline int ConvertTo(const char* item)
    //{
    //    return atoi(item);
    //}
     
    /** compile mais n'est pas appelé **/
    template <int>
    inline int ConvertTo(const char* item)
    {
        cout << "Fonction spécialisée appelée" << endl;
        return atoi(item);
    }
     
    /** compile mais n'est pas appelé **/
    template <int, const char *>
    inline int ConvertTo(const char* item)
    {
        cout << "Fonction spécialisée appelée" << endl;
        return atoi(item);
    }
     
    /** Compile, mais pour être appelé il faut enlever le <int> lors de l'appel **/
    inline int ConvertTo(const char*item)
    {
        cout << "Fonction spécialisée appelée" << endl;
        return atoi(item);
    }
     
    int main()
    {
        string a = "130";
        int i = ConvertTo<int>(a);
        cout << i << endl;
     
        const char * b = "10";
        int j = ConvertTo<int>(b);
        cout << j << endl;
        return 0;
    }
    J'ai MinGW...
    Es-ce un comportement normal avec les pointeurs, ou avec d'autre compilateurs (comme le GCC le plus récent) ça marche?

    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ta spécialisation ne compile pas car elle n'en est pas une : le paramètre est différent (tu ne le prends pas par référence constante dans ta spécialisation).

    Elle devrait avoir ce prototype pour être une spécialisation valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <>
    inline int ConvertTo<int, const char*>(char const * const & item)

  3. #3
    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
    Merci beaucoup!!

    Je ne savais pas qu'on pouvait mettre deux fois le mot const!

    Là ça marche impec

    Merci

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Mets des parenthèses....

    tu veux :

    B const &
    avec B = char const *
    =>
    (char const *) const &

    soit

    char const * const &

    soit, en lisant de droite à gauche:
    Une référence sur un (pointeur de charactères constants) constant.

  5. #5
    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
    Ne t'inquiète pas, j'ai compris maintenant. En fait c'est que le compilateur m'avait déjà sorti un message d'erreur comme "const utilisé deux fois" auparavant, dans un autre contexte, donc il m'était pas venu à l'idée de mettre un deuxième const après l'étoile...

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

Discussions similaires

  1. MyQItemDelegate::createEditor n'est jamais appelé
    Par traiangueul dans le forum Qt
    Réponses: 8
    Dernier message: 16/12/2010, 14h02
  2. Réponses: 6
    Dernier message: 04/11/2009, 10h57
  3. [EasyMock] Vérifier qu'une méthode n'est jamais appelée
    Par proner dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 26/03/2009, 17h13
  4. [servlet][filtre] filtre qui n'est pas appelé
    Par felix79 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 29/06/2005, 20h09
  5. [ Struts ] Erreur : l'action n'est jamais appelé
    Par romain3395 dans le forum Struts 1
    Réponses: 3
    Dernier message: 25/06/2004, 14h59

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