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 :

Surcharge particulière de fonctions templates ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 48
    Par défaut Surcharge particulière de fonctions templates ?
    Bonjour à tous,
    Mon problème peut être résumé dans le code suivant :

    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
     
    #include <iostream>
    #include <vector>
    #include <list>
     
    using namespace std;
     
    template<class T> void foo(const T& t)
    {
    	cout << "Default" << endl;
    };
     
    template<class T> void foo(const vector<T>& v)
    {
    	cout << "Vector : " << v.size() << endl;
     
    	for(uint i=0;i<v.size();i++)
    	{
    		foo(v[i]);
    	}
    };
     
    template<typename T> void foo(const list<T>& v)
    {
    	cout << "List : " << v.size() << endl;
    };
     
    int main(int argc, char **argv)
    {
    	vector< list<double> > v(3);
    	v[0] = list<double>(1);
    	v[1] = list<double>(2);
    	v[2] = list<double>(3);
     
    	foo(v);
     
    	return 0;
    }
    Ce code compile sous gcc 4.2.4 mais alors que je m'attendrais à ce qu'il me renvoie :

    Vector : 3
    List : 1
    List : 2
    List : 3
    j'ai à la place :

    Vector : 3
    Default
    Default
    Default
    Sauriez-vous comment corriger ce code pour obtenir le résultat attendu en exploitant au mieux les fonctions template ?? Faut-il abandonner les templates dans cette configuration ?

    Merci pour votre aide.

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    La surchage pour list<> n'est pas visible dans la surcharge pour vector<>. Inverse les deux definitions ou bien ajoute une declaration pour la surchage pour list<> avant celle pour vector<>.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 48
    Par défaut
    Merci pour ta réponse, mais le nouveau code suivant (avec les prédéclarations) ne change rien au résultat.

    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
     
    #include <iostream>
    #include <vector>
    #include <list>
     
    using namespace std;
     
    template<class T> void foo(const T& t);
    template<class T> void foo(const vector<T>& v);
    template<class T> void foo(const list<T>& v);
     
    template<class T> void foo(const T& t)
    {
    	cout << "Default" << endl;
    }
     
    template<class T> void foo(const vector<T>& v)
    {
    	cout << "Vector : " << v.size() << endl;
     
    	for(uint i=0;i<v.size();i++)
    	{
    		foo(v[i]);
    	}
    }
     
    template<class T> void foo(const list<T>& v)
    {
    	cout << "List : " << v.size() << endl;
    }
     
    int main(int argc, char **argv)
    {
    	vector< list<double> > v(3);
    	v[0] = list<double>(1);
    	v[1] = list<double>(2);
    	v[2] = list<double>(3);
     
    	foo(v);
     
    	return 0;
    }

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Ca marche ici apres avoir fixe la compilation. (Sur Solaris, Linux et AIX)

    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
    $ cat surcharge.cpp
    #include <iostream>
    #include <vector>
    #include <list>
     
    using namespace std;
     
    template<class T> void foo(const T& t);
    template<class T> void foo(const vector<T>& v);
    template<class T> void foo(const list<T>& v);
     
    template<class T> void foo(const T& t)
    {
            cout << "Default" << endl;
    }
     
    template<class T> void foo(const vector<T>& v)
    {
            cout << "Vector : " << v.size() << endl;
     
            for(int i=0;i<v.size();i++)
            {
                    foo(v[i]);
            }
    }
     
    template<class T> void foo(const list<T>& v)
    {
            cout << "List : " << v.size() << endl;
    }
     
    int main(int argc, char **argv)
    {
            vector< list<double> > v(3);
            v[0] = list<double>(1);
            v[1] = list<double>(2);
            v[2] = list<double>(3);
     
            foo(v);
     
            return 0;
    } 
     
    $ g++-4.3 -Wall -Wextra -o surcharge surcharge.cpp
    surcharge.cpp:31: warning: unused parameter 'argc'
    surcharge.cpp:31: warning: unused parameter 'argv'
    surcharge.cpp: In function 'void foo(const std::vector<T, std::allocator<_CharT>
     >&) [with T = std::list<double, std::allocator<double> >]':
    surcharge.cpp:38:   instantiated from here
    surcharge.cpp:20: warning: comparison between signed and unsigned integer expres
    sions
    $ ./surcharge 
    Vector : 3
    List : 1
    List : 2
    List : 3
    $ CC -V
    CC: Sun C++ 5.9 Linux_i386 Patch 124865-01 2007/07/30
    $ CC -o surcharge surcharge.cpp
    $ ./surcharge
    Vector : 3
    List : 1
    List : 2
    List : 3

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par rulianf Voir le message
    Merci pour ta réponse, mais le nouveau code suivant (avec les prédéclarations) ne change rien au résultat.

    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
     
    #include <iostream>
    #include <vector>
    #include <list>
     
    using namespace std;
     
    template<class T> void foo(const T& t);
    template<class T> void foo(const vector<T>& v);
    template<class T> void foo(const list<T>& v);
     
    template<class T> void foo(const T& t)
    {
    	cout << "Default" << endl;
    }
     
    template<class T> void foo(const vector<T>& v)
    {
    	cout << "Vector : " << v.size() << endl;
     
    	for(uint i=0;i<v.size();i++)
    	{
    		foo(v[i]);
    	}
    }
     
    template<class T> void foo(const list<T>& v)
    {
    	cout << "List : " << v.size() << endl;
    }
     
    int main(int argc, char **argv)
    {
    	vector< list<double> > v(3);
    	v[0] = list<double>(1);
    	v[1] = list<double>(2);
    	v[2] = list<double>(3);
     
    	foo(v);
     
    	return 0;
    }
    et pourtant, chez moi cela fonctionne sans problème (Gcc 4.3.0, Code::Blocks rev 5322, win XP pro SP3, atlon 1700 XP)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    COK : Idem avec Visual Express 2008

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 48
    Par défaut
    Merci pour toutes vos réponses. Je ne sais pas trop ce qui c'est passé mais le code fonctionne maintenant. Il y a des fois comme ça où il ne vaut mieux pas chercher à comprendre...

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

Discussions similaires

  1. Surchargé une fonction template avec template
    Par SKone dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2014, 20h00
  2. Surcharge de fonction template
    Par camboui dans le forum C++
    Réponses: 3
    Dernier message: 09/05/2011, 11h25
  3. surcharge fonction template
    Par Montag dans le forum Langage
    Réponses: 6
    Dernier message: 21/08/2008, 18h48
  4. fonctions template
    Par romeo9423 dans le forum Langage
    Réponses: 12
    Dernier message: 22/01/2005, 16h13
  5. Fonctions template+friend sous VC7
    Par patapetz dans le forum MFC
    Réponses: 12
    Dernier message: 24/09/2004, 11h16

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